我有一个WebAPI后端,使用ODATA v3向各种客户端提供库存信息等(由于我们使用的组件中的限制,我无法使用v4)。库存数据库非常大(100K +记录),ODATA非常适合服务器端过滤,分页等,并保持数据传输的精简。
库存记录具有一些未映射的属性,而是在进行查询时即时计算和填充。例如:
[NotMapped]
public decimal RebateAmount { get; set; }
问题是ODATA忽略了任何NotMapped属性,因此它们永远不会被发送回客户端。
我知道之前已经问过这个问题了,但是现在已经有了这个问题,所以我希望现在已经添加了对此的支持,或者有人有一个简单的解决方法(缺少EF在DB)中创建这些字段。
我已经尝试过这种丑陋的解决方法,但它没有用(RebateAmount仍未包含在ODATA中):
private decimal _rebateAmount;
public decimal RebateAmount { get {return _rebateAmount; } }
public void SetRebateAmount(decimal amount)
{
_rebateAmount = amount;
}
是否有(最好是简单的)方法在ODATA结果集中包含非DB属性?
修改1/7/2017 为了在我的场景中有用,ODATA还需要在其元数据中包含计算字段,否则自动生成的(客户端)代理类将不包含它们。
答案 0 :(得分:8)
我知道这是一个旧帖子但是在WebApiConfig文件中只需添加以下内容,它将公开“NotMapped”属性。
builder.StructuralTypes.First(t => t.ClrType == typeof(YourModel)).AddProperty(typeof(YourModel).GetProperty("RebateAmount"));
“builder”是你的IEdmModel。最有可能是你的“GetEdmModel”方法。
答案 1 :(得分:2)
一种方法可以是使用带有附加计算属性的DTO对象创建OData EDMModel。
请查看具有执行详细信息的答案:Mapping OData query against a DTO to another entity?
DTO可以通过View at Database服务器进行映射 或者可以使用OdataQueryOptions在控制器中计算。
答案 2 :(得分:1)
最简单的方法(至少对于EF Core):使用fluent-api!
您可以像这样定义NotMapped-Attribute而不是:
modelBuilder.Entity<Product>().Ignore(p => p.RebateAmount);
对于EF6,您还应该查看以下问题:EF Code First prevent property mapping with Fluent API