我创建了一个部分类文件来向实体框架生成的模型中添加新的属性。
我使用的是WebAPI + OData,而$metadata 没有列出我的新/自定义属性,因此它返回的JSON不包括我的新/自定义属性。
例如,假设我的实体是"Person“
"Person“有一个数据库属性: NumSpouses;在$metadata中返回的int,如下所示:<Property Name="NumSpouses" Type="Edm.Int32"/>
这很好,但是我将这样的属性添加到一个单独的文件,with a partial class:
public partial class Person {
...
public string MarriedStatus {
get { return this.NumSpouses==0 ? "Single" : "Married"; }
}
...
}如何在我的OData响应中获得此属性?
<Property Name="MarriedStatus" Type="Edm.String"/>
目前,如果我要求MarriedStatus in $expand (就像一个NavigationProperty.).我不认为我会尝试$expand,就好像它神奇地提供了自定义属性一样),我会收到这样的消息:
{
"odata.error":{
"code":"","message":{
"lang":"en-US","value":"The query specified in the URI is not valid. Could not find a property named 'MarriedStatus' on type 'fakeDataModels.Person'."
},"innererror":{
"message":"Could not find a property named 'MarriedStatus' on type 'fakeDataModels.Person'.","type":"Microsoft.Data.OData.ODataException","stacktrace":" at ..."
}
}
}发布于 2016-04-01 21:44:39
MarriedStatus是一个计算/只读属性。ASP.NET实现的OData目前不支持这样的属性。作为解决办法,添加一个抛出NotImplementedException的setter。
public string MarriedStatus {
get { return this.NumSpouses > 0 ? "Married" : "Single"; }
set { throw new NotImplementedException(); }
}或者,如果您使用的是OData V4,则可以对MarriedStatus进行注释以指定其计算结果。见Yi Ding's answer to OData read-only property。但是注释只是建议性的;它并不阻止客户端尝试设置计算的属性(例如,在POST请求中)。
发布于 2018-02-09 09:21:09
除了安切斯特的回答。您应该使用的忽略()函数,而不是NotMapped属性。因为OData查找此属性以忽略序列化的属性。如果您使用fluent API,您将不会遇到这个问题。
dbModelBuilder.Entity<TEntity>()
.Ignore(i => i.ComputedProperty);https://stackoverflow.com/questions/36344979
复制相似问题