2016-03-31 7 views
2

部分クラスファイルを作成して、Entity-Framework生成モデルに新しいプロパティを追加しました。ODataには、Partialクラスを使用してEntity Frameworkモデルに追加された「カスタムプロパティ」が含まれています

私はWebAPI + ODataを使用していますが、$ metadata は新しい/カスタムプロパティをリストしていないので、それが返すJSONに新しい/カスタムプロパティは含まれません。例えば

、のが私のエンティティは「人」であるとしましょう

「人」とは、一のDatabaseプロパティを持っています。 NumSpouses;このように$メタデータで返される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"/>

私は$expandMarriedStatusを求めた場合、それはそれはありません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 ..." 
    } 
    } 
} 
+0

パーシャルクラスはEF生成モデルと同じ名前空間にありますか? – lencharest

+0

はい、そうです。名前空間は一貫しており、両方のファイルで "PersonDataModels"と呼ばれ、両方のファイルが同じプロジェクトにあります。私は 'Controller.Json'を知っています。JSONのシリアル化はODataのシリアル化と同じではありませんが、明示的に(ScriptOgnoreAttribute')にしない限り、JSONは' MarriedStatus'プロパティをシリアル化します。これは "ViewModel"と同等のものを要求するかもしれませんが、私はクライアントサイド(Javascript)コードに追加する必要があります。これは便利な関数 'getMarriedStatus()'を提供するだけです。 –

+0

パーシャルクラスは、私が作成したおもちゃプロジェクトで期待通りに機能します。たぶん、あなたのOData構成に問題があります。あなたは 'ODataConventionModelBuilder'を使い、単にエンティティセットを登録していますか?あるいはもっと洗練された何か? – lencharest

答えて

3

MarriedStatusは計算/読み取り専用プロパティです。 ODataのASP.NET実装は、現在このようなプロパティをサポートしていません。回避策として、NotImplementedExceptionをスローするセッターを追加します。

public string MarriedStatus { 
     get { return this.NumSpouses > 0 ? "Married" : "Single"; } 
     set { throw new NotImplementedException(); } 
    } 

オプションでは、ODataのV4を使用している場合、あなたはそれが計算されていることを指定するには、MarriedStatusに注釈を付けることができます。 Yi Ding's answerOData read-only propertyを参照してください。しかし、注釈は助言のみです。クライアントが(例えば、POSTリクエストで)計算されたプロパティを設定しようとすることを妨げるものではありません。

+1

しかし、セッターが存在し、そのプロパティーがデータベースに存在しない場合は、プロパティーをLINQ to Entitiesのチョークとしてシリアル化しようとすると問題が発生します。 [この質問](https://stackoverflow.com/questions/6919709/only-initializers-entity-members-andentity-navigation-properties-are-supporte)を参照してください – MylesRip

0

lencharestの回答に加えて、 [NotMapped]属性の代わりにEntity FrameworkのFluent APIのIgnore()関数を使用する必要があります。 ODataはこの属性を検索してシリアル化のプロパティを無視するためです。流暢なAPIを使用している場合、この問題は発生しません。

dbModelBuilder.Entity<TEntity>() 
    .Ignore(i => i.ComputedProperty); 
+0

しかし、私は* more * columnsを含んでいます。私は列を無視したくない。 Ignore/NotMappedがどのように関係するかはわかりません –

+0

.Ignore()は、Entity Frameworkがデータベースに存在しないかのようにこのプロパティを無視するように指示します。したがって、挿入、選択、更新のためにこれを無視しますが、モデルに追加することはできます。この方法で、必要なものを追加できます。私は@MylesRipへの回答も提供していました。 – bdebaere

関連する問題