#c# #entity-framework #.net-core #entity-framework-core
#c# #entity-framework #.net-ядро #сущность-фреймворк-ядро
Вопрос:
Я использую .Net Core Entity Framework для тестового приложения для научного эксперимента.
У меня есть следующая модель, которая используется в одном из наших контроллеров EF.
Эта модель имеет вызываемое вычисляемое свойство fuelBurnPerSecond
, которое использует другие свойства для вычисления.
Этого вычисляемого свойства нет в базе данных (и я не могу его добавить, потому что это очень старая БД).
В любом случае, когда я нажимаю метод controllers GET
, чтобы получить список всех RocketTestProtocols
, я не вижу fuelBurnPerSecond
в возвращаемом JSON. Я вижу все остальное, но не вычисляемое свойство.
Однако я не получаю никаких ошибок.
Вот модель:
public partial class RocketTestProtocols
{
public int EngineMass { get; set; }
public int FuelVolume { get; set; }
public WeatherStations WeatherStation { get; set; }
public int fuelBurnPerSecond = ((EngineMass * 0.2) * (FuelVolume * 1.9) / WeatherStation.VelocityWave);
}
Контроллер:
[HttpGet]
public async Task<ActionResult<IEnumerable<RocketTestProtocols>>> GetRocketTestProtocols()
{
return await _context.RocketTestProtocols.ToListAsync();
}
Как я могу заставить контроллер вернуть вычисленное свойство fuelBurnPerSecond
?
Спасибо!
Комментарии:
1. Свойство должно быть отправлено сервером, который создает ответ. Ответ — это то, что контроллер анализирует для создания классов.
2. Можете ли вы показать действие вашего контроллера, пожалуйста?
3. Может быть, это не очень хорошая идея, но это единственное поле, которое не является свойством. Вы должны попробовать изменить его на
public int fuelBurnPerSecond { get { return ((EngineMass * 0.2) * (FuelVolume * 1.9) / WeatherStation.VelocityWave); }
4. @jdweng спасибо, вы имеете в виду отправлено контроллером? Я добавил код контроллера к своему вопросу. Контроллер отправляет обратно все остальные свойства, только не вычисляемое свойство. Нужно ли мне что-то добавлять к моему контроллеру? Спасибо!
5. С помощью HTTP вы отправляете запрос от клиента и получаете ответ от сервера. Контроллер анализирует ответ в задаче<ActionResult> . В ответе есть RocketTestProtocols в качестве корня ответа.
Ответ №1:
Вы должны добавить атрибут [NotMapped] к этому свойству или использовать fluent Api ignore:
[NotMapped]
public int fuelBurnPerSecond
{
get { return ... your code }
}
//or in dbcontext
modelBuilder.Entity<RocketTestProtocols>().Ignore(c => c.fuelBurnPerSecond );
И, кстати, попробуйте исправить свой класс тоже:
public partial class RocketTestProtocols
{
....
public int WeatherStationId { get; set; }
public WeatherStations WeatherStation { get; set; }
....
}
Ответ №2:
fuelBurnPerSecond
В вашей модели объявлено как поле, а не как свойство. Ядро Entity Framework не включает поля в модели, возвращаемые в результате запроса.
Измените fuelBurnPerSecond
на свойство, доступное только для чтения, поскольку вы никогда не будете устанавливать значение для этого свойства —
public int FuelBurnPerSecond
{
get { return (EngineMass * 0.2) * (FuelVolume * 1.9) / WeatherStation.VelocityWave; }
}
Комментарии:
1. Когда я это сделал, я получаю сообщение об ошибке,
property or indexer must have at least one accessor
2. Возможно, у вас какая-то опечатка.
at least one accessor
уже есть,get
аксессуар.3. @SkyeBoniwell Вы заменили
fuelBurnPerSecond
поле на свойство, указанное выше?