2011-04-30 7 views
0

エンティティフレームワークでPOCOクラスのアプローチにいくつかの制限がありました。なぜなら、エンティティはDbContext参照を保持せずに関連するクエリを単独で処理できないからです。プロキシはそれを個人的に参照しており、アクセスすることはできません。私が達成したいことは、以下のモデル保持フォロワーではありますが、フォロワーの代わりにフォロワーの数が必要な場合、モデルにはコンテキストが参照されないため、これをモデルで行うことはできません。それで解決策が保持されているFollowersCountは、モデルのプロパティをマップせず、リポジトリ内でクエリを実行してから設定します。これは、新しいDTOを作成せずにDTOオブジェクトを作成するように見えます。エンティティは自分のDbContextを認識していますか?

2番目のアプローチは、DbContext参照をモデルプロパティで明示的に保持しておき、マップされていない関連クエリーを実行することができます。

両方の手法の欠点は、フェッチされたモデルごとに手動で値を繰り返し設定することです。どちらのソリューションもどう思いますか?より良いアプローチはありますか?

public class Post : Entity 
{ 
    public string Title { get; set; } 
    [NotMapped] 
    public DbContext Context { get; set; } 
    public virtual List<User> Followers{ get; set; } 
    public virtual FollowersCount() 
    { 
     return //use DbContext and just execute query for count of Followers 
    } 
} 

答えて

3

このアイデアは、かなり重くなっているseparation of concernsです。エンティティをEFに依存させる=データアクセスコードでドメインモデルを混乱させる。 ORMを正しく使用したい場合は、問題をORMの方法で正しく解決してください。あなたは信者の数が必要な場合には、二つの選択肢があります。

  • ロードフォロワーを、簡単なコレクションのCountを使用する - それが実体によって行わdoamin方法です
  • のカウントのためのデータアクセス層を依頼 - それはで行われたデータへのアクセス方法です。データアクセス層

ドメインモデルのポイントは、データアクセス層(リポジトリ、EF、データアクセスオブジェクトなど)のポイントであるクエリデータベースではなく、読み込まれたオブジェクトで動作することです。あなたがそれらを読み込まずに信者の数を取得する必要がある場合:

int count = context.Entry(post) 
        .Collection(p => p.Followers) 
        .Query() 
        .Count(); 
関連する問題