【问题标题】:Computed property in model not being returned by controller控制器未返回模型中的计算属性
【发布时间】:2021-02-17 14:23:14
【问题描述】:

我正在将 .Net Core Entity Framework 用于科学实验的测试应用程序。

我的 EF 控制器中使用了以下模型。

此模型有一个名为 fuelBurnPerSecond 的计算属性,它使用其他属性进行计算。

此计算属性不在数据库中(我无法添加它,因为它是一个非常旧的数据库)。

无论如何,当我点击控制器GET 方法来获取所有RocketTestProtocols 的列表时,我在返回的JSON 中看不到fuelBurnPerSecond。我看到了其他所有内容,但没有看到计算属性。

我没有收到任何错误。

这是模型:

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

谢谢!

【问题讨论】:

  • 该属性必须由创建响应的服务器发送。响应是控制器解析以生成类的内容。
  • 你能展示你的控制器动作吗?
  • 也许这不是一个好主意,但该字段是唯一不是属性的字段。您应该尝试将其更改为 public int fuelBurnPerSecond { get { return ((EngineMass * 0.2) * (FuelVolume * 1.9) / WeatherStation.VelocityWave); }
  • @jdweng 谢谢,你的意思是控制器发送的?我将控制器代码添加到我的问题中。控制器发回所有其他属性,而不是计算属性。我需要向我的控制器添加一些东西吗?谢谢!
  • 使用 HTTP,您从客户端发送请求并从服务器获得响应。控制器解析 Task 中的响应。响应以 RocketTestProtocols 作为响应的根。

标签: c# entity-framework .net-core entity-framework-core


【解决方案1】:

你必须给这个属性添加[NotMapped]属性,或者使用fluent Api忽略:

[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 Core 不包含作为查询结果返回的模型中的字段。

    fuelBurnPerSecond 更改为一个属性,这是一个只读属性,因为您永远不会为该属性设置值 -

    public int FuelBurnPerSecond
    {
        get { return (EngineMass * 0.2) * (FuelVolume * 1.9) / WeatherStation.VelocityWave; }
    }
    

    【讨论】:

    • 当我这样做时,我收到一条错误消息,property or indexer must have at least one accessor
    • 也许你有任何错字。 at least one accessor 已经存在,get 访问器。
    • @SkyeBoniwell 你用上面的属性替换了fuelBurnPerSecond 字段吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2014-07-05
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多