部分クラスファイルを作成して、Entity-Framework生成モデルに新しいプロパティを追加しました。ODataには、Partialクラスを使用してEntity Frameworkモデルに追加された「カスタムプロパティ」が含まれています
私はWebAPI + ODataを使用していますが、$ metadata は新しい/カスタムプロパティをリストしていないので、それが返すJSONに新しい/カスタムプロパティは含まれません。例えば
、のが私のエンティティは「人」であるとしましょう
「人」とは、一のDatabaseプロパティを持っています。 NumSpouses;このように$メタデータで返されるint型:素晴らしいことだが、私は別のファイルにこのようなプロパティを追加 <Property Name="NumSpouses" Type="Edm.Int32"/>
public partial class Person {
...
public string MarriedStatus {
get { return this.NumSpouses==0 ? "Single" : "Married"; }
}
...
}
は、どのように私は私のODataで利用できるこのプロパティを取得することができます反応?
<Property Name="MarriedStatus" Type="Edm.String"/>
私は$expand
にMarriedStatus
を求めた場合、それはそれはありません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 ..."
}
}
}
パーシャルクラスはEF生成モデルと同じ名前空間にありますか? – lencharest
はい、そうです。名前空間は一貫しており、両方のファイルで "PersonDataModels"と呼ばれ、両方のファイルが同じプロジェクトにあります。私は 'Controller.Json'を知っています。JSONのシリアル化はODataのシリアル化と同じではありませんが、明示的に(ScriptOgnoreAttribute')にしない限り、JSONは' MarriedStatus'プロパティをシリアル化します。これは "ViewModel"と同等のものを要求するかもしれませんが、私はクライアントサイド(Javascript)コードに追加する必要があります。これは便利な関数 'getMarriedStatus()'を提供するだけです。 –
パーシャルクラスは、私が作成したおもちゃプロジェクトで期待通りに機能します。たぶん、あなたのOData構成に問題があります。あなたは 'ODataConventionModelBuilder'を使い、単にエンティティセットを登録していますか?あるいはもっと洗練された何か? – lencharest