Entity FrameworkオブジェクトをJSONにシリアル化する

asp.net-ajax entity-framework json wcf

質問

WCFのネイティブDataContractJsonSerializerまたはASP.NETのネイティブJavaScriptシリアライザを使用しても、Entity FrameworkオブジェクトをJSONにシリアル化することはできないようです。これは、両方のシリアライザが拒否する参照カウントの問題によるものです。私はJson.NETも試してみました 。これもまた参照カウント問題では特に失敗します。


編集: Json.NETはEntity Frameworkエンティティをシリアライズおよびデシリアライズできるようになりました


私のオブジェクトは、追加のビジネス機能(認証など)を実行するためにオーバーロードされているEntity Frameworkオブジェクトです。プラットフォームに依存しないAPIを提示したいので、プラットフォーム固有の属性などでこれらのクラスを装飾したくありません。 。

私は実際に私がhttps://blog.programx.co.uk/2009/03/18/wcf-json-serialization-woes-and-a-solution/で行った個々のステップについてブログを書いています

明白なことを逃したことがありますか?

受け入れられた回答

これを行う方法は、シリアライズしたいデータを無名型に射影し、それをシリアライズすることです。これにより、実際にJSONに必要な情報だけが確実にシリアル化されます。オブジェクトグラフの下にあるものを誤ってシリアル化することはありません。それはこのように見えます:

var records = from entity in context.Entities
              select new 
              {
                  Prop1 = entity.Prop1,
                  Prop2 = entity.Prop2,
                  ChildProp = entity.Child.Prop
              }
return Json(records);

匿名型は、これにはほぼ理想的です。 JSONは、明らかに、どの型がそれを生成するために使用されたかを気にしません。匿名型を使用すると、JSONにどのようなプロパティと構造を追加するかに関して、完全な柔軟性が得られます。


人気のある回答

MicrosoftはEFオブジェクトをデータコントラクトに変換する方法に誤りがありました。それらは基本クラスとバックリンクを含んでいました。

最善の策は、返す各エンティティに対して同等のデータ転送オブジェクトクラスを作成することです。これらにはデータだけが含まれ、行動は含まれず、エンティティのEF固有の部分は含まれません。 DTOクラスとの間で相互に変換するためのメソッドも作成します。

それからあなたのサービスはデータ転送オブジェクトを返すでしょう。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ