如何让ODATA序列化NotMapped属性



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

库存记录有一些属性没有映射,而是在进行查询时实时计算和填充。例如:

[NotMapped]
public decimal RebateAmount { get; set; }

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

我知道以前有人问过这个问题,但那是很久以前的事了,所以我希望现在已经添加了对此的支持,或者有人有一个简单的解决方法(除了让EF在DB中创建这些字段之外)。

我尝试过这种丑陋的变通方法,但没有奏效(ODATA仍然没有包括回扣金额):

private decimal _rebateAmount;
public decimal RebateAmount { get {return _rebateAmount; } }
public void SetRebateAmount(decimal amount)
{
_rebateAmount = amount;
}

有没有一种(最好是简单的)方法可以在ODATA结果集中包含非DB属性

编辑2017年7月1日为了在我的场景中有用,ODATA还需要在其元数据中包括计算字段,否则自动生成的(客户端)代理类将不包括这些字段。

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

builder.StructuralTypes.First(t => t.ClrType == typeof(YourModel)).AddProperty(typeof(YourModel).GetProperty("RebateAmount"));

其中"构建器"是您的IEdmModel。最有可能是在您的"GetEdmModel"方法中。

最简单的方法(至少对于EF Core):使用fluent api!

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

modelBuilder.Entity<Product>().Ignore(p => p.RebateAmount);

对于EF6,您还应该看看这个问题:EF代码首先阻止Fluent API 的属性映射

一种方法可以是通过创建具有附加计算属性的DTO对象的OData EDMModel。

请检查这个答案,它有实现这一点的详细信息:将针对DTO的OData查询映射到另一个实体?

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

如果遇到此问题,上述建议在EF的后续版本中不起作用。我能够让它与以下内容一起工作:

// Add this to the DB Context:
// *****************************************
modelBuilder.Entity<ModelObject>().Ignore(a => a.PropertyName);
// Add this to the Model Object
// *****************************************
public string PropertyName { 
get { return _expression1.Evaluate(this); } 
set { }     // # This is the magic piece that makes it work
}

魔术片是二传手。

最新更新