如何让ODATA序列化NotMapped属性

Lar*_*335 9 c# entity-framework odata asp.net-web-api

我有一个WebAPI后端,使用ODATA v3向各种客户端提供库存信息等(由于我们使用的组件中的限制,我无法使用v4).库存数据库非常大(100K +记录),ODATA非常适合服务器端过滤,分页等,并保持数据传输的精简.

库存记录具有一些未映射的属性,而是在进行查询时即时计算和填充.例如:

[NotMapped]
public decimal RebateAmount { get; set; }
Run Code Online (Sandbox Code Playgroud)

问题是ODATA忽略任何NotMapped属性,因此它们永远不会被发送回客户端.

我知道之前已经问过这个问题了,但是现在已经问过了,所以我希望现在已经添加了对此的支持,或者有人有一个简单的解决方法(没有让EF在数据库中创建这些字段).

我尝试过这个丑陋的解决方法,但它没有用(RebateAmount仍然没有包含在ODATA中):

private decimal _rebateAmount;
public decimal RebateAmount { get {return _rebateAmount; } }

public void SetRebateAmount(decimal amount)
{
   _rebateAmount = amount;
}
Run Code Online (Sandbox Code Playgroud)

是否有(最好是简单的)方法在ODATA结果集中包含非DB属性?

编辑1/7/2017 为了在我的场景中有用,ODATA还需要在其元数据中包含计算字段,否则自动生成的(客户端)代理类将不包含它们.

gor*_*oth 8

我知道这是一个旧帖子,但在WebApiConfig文件中只需添加以下内容,它将公开"NotMapped"属性.

builder.StructuralTypes.First(t => t.ClrType == typeof(YourModel)).AddProperty(typeof(YourModel).GetProperty("RebateAmount"));
Run Code Online (Sandbox Code Playgroud)

"builder"是你的IEdmModel.最有可能在你的"GetEdmModel"方法中.


Jos*_*hit 6

最简单的方法(至少对于 EF Core 而言):使用 Fluent-api!

您可以这样定义它,而不是 NotMapped-Attribute:

modelBuilder.Entity<Product>().Ignore(p => p.RebateAmount);
Run Code Online (Sandbox Code Playgroud)

对于 EF6,您还应该看看这个问题:EF Code First Prevent property Mapping with Fluent API


Ank*_*kit 2

一种方法是使用具有附加计算属性的 DTO 对象创建 OData EDMModel。

请检查此答案,其中包含执行此操作的实现详细信息:将针对 DTO 的 OData 查询映射到另一个实体?

DTO 可以通过数据库服务器上的视图进行映射,也可以使用OdataQueryOptions在控制器中进行计算。