2011-08-13 9 views
0

Entity Frameworkコード4.1およびMVC3を使用してアプリケーションを開発中です。基本的にState => City => Localityという3つのエンティティがあります。循環参照が許可されていない - Jsonシリアル化

public class State { 
    public virtual List<City> Cities { get; set; } 
} 

public class City { 
    public virtual List<Locality> Localities { get; set; } 
    public virtual State State { get; set; } 
} 

public class Locality { 
    public virtual City City { get; set; } 
} 

私は、3つのエンティティすべてに対して双方向関係を使用していることがわかります。 Jsonはそれを許さないので、私はやや不満です。基本的には、どちらの方向にもナビゲートする必要があります。例えば、ある市が与えられた場合、私は自分が所属する州を容易に見つけることができるようにしたいと考えています。

私はウェブをスキャンし、いくつかの回避策を見つけましたが、どれも自分のシナリオに合っていません。最初は、関係を単方向にすることでした(誰がそれを行うのですか?)、私はそれを望んでいません。他のものは、必要なプロパティだけをViewModelに導入することでしたが、Entityのすべてのフィールドを定期的に使用する必要がある場合は、重複したコードを意味します。また、私のコントローラにはこれらのプロパティがあふれています。だから私はそれも好きではない。

これは単なる基本的なものだと思っていましたが、今は実現可能な解決策を見つけるのに苦労しています。誰かがより良い選択肢(おそらくMVC3の何か)を持っているなら、私を助けてください。

答えて

0

をあなたはシリアル化プロセスを制御するためにconverterを直接JavaScriptSerializerを使用して、独自の登録を試みることができる。

+0

私はまだそれを実装していないが、私はJavascriptSerializerが良い方法だと思う。しかし、[ScriptIgnore]という属性があり、jsonがその属性が定義されている関係をナビゲートできなくなります。私はそれを広範囲にテストしていないが、現在はうまくいくようだ。私は.netコードで双方向にナビゲートすることができます。つまり、私は本当に双方向の関係にあります。 – Jatin

0

私はASPのエキスパートではありませんが、私はJava、Groovy、Python、その他の言語で私が何をしているのかを知ることができると思います。

私が提案することができる最もよい解決策は、City.Localitiesを「一時的な」(Java用語で)フィールドの一種にすることです。つまり、直列化しませんが、ロード時に更新します。これはLocalityクラスのSetterにカプセル化することができます。 Locality.setCityのsetメソッドでは、city-> localities.append(this)(これを書く言語)を呼び出す必要があります。これはCity-> Localitiesの「ランタイムキャッシュ」になります。ロード中に一度構築する。

+0

を私は前にJavaを働いているが、私は完全にあなたのソリューションを理解していません。シンプルなシナリオでは、単一の都市だけをロードするとどうなりますか。その場合、Locality.setCity()は呼び出されることはなく、私がロードしているCity内のLocalitiesを検索しなければなりません。もし私が理解できなければ、私を許してください。 – Jatin

0

問題は、エンティティタイプのためにDataContractJsonSerializerをサポートしているネイティブの問題のように見えます。要するに、あなたの例では、Citiesテーブルに接続された状態テーブルは、Stateが多くの都市とCiを持つ可能性があるため、Jsonシリアライズにはうまく変換されませんtyは州に関連付けられています。

簡単な解決策の1つは、匿名オブジェクトの投影です。この例のように 何か:参考

public JsonResult Orders() 
    var results = from Ord in databaseContext.Orders 
      select new 
      { 
       OrderID = Ord.ID, 
       OrderTitle = Ord.Name, 
       OrderDate = Ord.OrderDate 
      } 

    return Json(results); 
} 

、この参照:Serializing Entity Framework Objects into JSON Using ASP.Net MVC

+0

私はすでに私の質問で、使用したいプロパティでコントローラを汚染したくないと言いました。これは最も簡単な解決策ですが、どういうわけか私はそれを使用する可能性は低いです。あなたのアドバイスをありがとうございました。 – Jatin

+0

[ScriptIgnore]はあなたのエンティティを何とか汚染します。しかし、私はこのQ&A、JavaScriptSerializerテクニックから何か新しいことを学びました!ありがとうございましたNirvanと感謝@marcind。 –