The*_*Pea 5 entity-framework odata
我创建了一个部分类文件,以便为我的Entity-Framework生成的模型添加新属性.
我使用的是WebAPI + OData,$元数据没有列出我的新/自定义属性,因此它返回的JSON不包含我的新/自定义属性.
例如,假设我的实体是"人"
"Person"有一个Database属性; NumSpouses; 一个在$元数据中返回的int,如下所示:
<Property Name="NumSpouses" Type="Edm.Int32"/>
这很好,但是我将这样的属性添加到一个单独的文件中,并带有一个部分类:
public partial class Person {
...
public string MarriedStatus {
get { return this.NumSpouses==0 ? "Single" : "Married"; }
}
...
}
Run Code Online (Sandbox Code Playgroud)
如何在我的OData响应中获得此属性?
<Property Name="MarriedStatus" Type="Edm.String"/>
目前,如果我问MarriedStatus的$expand(就好像它是一个NavigationProperty ....它不是[我想我会尝试$不管怎么说扩大,因为如果它神奇地提供自定义属性]),我得到的消息是这样的:
{
"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 ..."
}
}
}
Run Code Online (Sandbox Code Playgroud)
MarriedStatus是计算/只读属性.OData的ASP.NET实现目前不支持此类属性.解决方法是添加一个抛出的setter NotImplementedException.
public string MarriedStatus {
get { return this.NumSpouses > 0 ? "Married" : "Single"; }
set { throw new NotImplementedException(); }
}
Run Code Online (Sandbox Code Playgroud)
(可选)如果您使用的是OData V4,则可以进行注释MarriedStatus以指定计算它.请参阅Yi Ding对OData只读属性的回答.但注释只是建议性的; 它不会阻止客户端尝试设置计算属性(例如,在POST请求中).