OData包括通过部分类添加到Entity Framework模型的"自定义属性"

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)

len*_*est 5

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 DingOData只读属性的回答.但注释只是建议性的; 它不会阻止客户端尝试设置计算属性(例如,在POST请求中).