2016-04-27 13 views
0

現在、C#を使用しているエンタテインメントフレームワークに接続しているプログラミングゲームです。ナビゲーションプロパティを事前にロードするか、Entity Frameworkで他の方法で処理する必要があります

私はゲームで使用される主なモデルであるテーブルとたくさんの関係を持っています。そのため、私はそれらのモデルの多くのナビゲーションプロパティを使用する必要があります。私は私のViewModelを作成するとき

私はこのようなコードを持っている:

 Avatar = new ImageViewModel(company.Entity.ImgUrl); 
     CountryName = company.Region.Country.Entity.Name; 
     RegionName = company.Region.Name; 
     Name = company.Entity.Name; 
     Money = MoneyViewModel.GetMoney(company.Entity.Wallet); 
     OwnerName = company.Owner.Name; 
     OwnerID = company.OwnerID; 

は、当然のことながら、それは私がナビゲーションproprtiesにアクセスしたい場合に複数のクエリを発射してしまいます。

モデルをビューモデルコンストラクタに渡す前に、この問題をマイコンに含めることで対処しました。 これは私の時間をひどく費やしています。なぜなら、最終的に私のビューモデルにどのナビゲーションプロパティが必要であるかを再帰的にチェックして最初のクエリに手動で含める必要があるからです。

私の質問は このコードデザインは適切ですか?そうでなければ、この種の問題に対する正しいアプローチは何ですか?

個人的には、長期的には扱いにくいと感じます。

答えて

1

あなたが熱心な負荷を選択している限り、必要なものを手動で含める必要があります。これはパフォーマンスのために支払う価格です。

私はこれとは別の方法でアプローチします。ビューとストアドプロシージャを作成して、希望のデータフィールドを取得し、Automapperを使用して値をDTOクラスに直接転送します。

これは通常私が行うことであり、それは報われます。私はパフォーマンスを得るだけでなく、すべてを非常にシンプルで保守的に保ちます。

1

熱心な読み込みを使用している限り、必要なすべてのネストされたナビゲーションプロパティを手動で含める必要があります。しかし、それはより良い前例の費用がかかる。

したがって、同じナビゲーションプロパティを含むコード内のdiffrenet場所で繰り返しクエリが発生した場合は、拡張メソッドで抽出してジョブを容易にすることができます。 Entity Framework - Is there a way to automatically eager-load child entities without Include()?の答えを確認してください。これは適切な例を示しています。

関連する問題