4

しばらく前に、エンティティの2つのコレクションを結合したときに、デフォルトの等式比較機能が機能しないように見える理由について質問しました。

EFコードファースト-LinqtoEntities Union EqualityComparer

答えは、DbContextの2つの異なるインスタンスを使用していたため、参照が異なるという事実によるものでした。

そのため、リクエスト全体でDbContentを共有しようとしています。「複雑な」例がいくつかありますが、もっと簡単な解決策を試してみようと思いました。

そこで、エンティティの概要を示すIDbContextインターフェイスを作成しました

public interface IDbContext {
   int SaveChanges();
   DbSet<News> News { get; set; }
   DbSet<Category> Categories { get; set; }
}

次に、私のDbContextは次のように実装されます。

public class SiteContext : DbContext, IDbContext {
   public DbSet<News> News { get; set; }
   public DbSet<Category> Categories { get; set; }

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      ...
   }
}

次に、2つのリポジトリ(NewsRepositoryとCategoryRespository)に、コンストラクターパラメーターとしてIDbContextがあります。

IDbContext _db;

public NewsRepository(IDbContext db) {
    _db = db;
}

では、リクエストスコープでIDbContextをSiteContextにバインドすると、リポジトリが同じコンテキストを共有すると仮定しますか?

 kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope();

ただし、前の質問からユニオンを再試行すると、まだ重複するエンティティが表示されます。私が間違っていることは何ですか?1つのリクエストで同じコンテキストを確実に使用しているかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

5

各リポジトリが構築されると、NinjectはリポジトリごとにSiteContextの新しいインスタンスを提供するためです。それが機能しない理由です。すべてのリポジトリが同じコンテキストを使用することを意味する、作業単位の実装を使用することをお勧めします。
UnitOfWorkは、構築時にIDbContextを取り込みます。

このようなものはうまくいくでしょう

private IDbContext _context;

public UnitOfWork(IDbContext context)
{
    _context = context
}

private _INewsRepository;
public INewsRepoitory 
{
    get{
         if(_INewsRepository == null)
         {
              _INewsRepository = new NewsREpository(_context);
              return _INewsRepository;
         }
         else
         {
              return _INewsRepository;
         }    
}
于 2011-06-14T22:13:53.107 に答える
-1

feanzのソリューションを改善するために、Ninjectを使用してINewsRepositoryのプロパティインジェクションを実行します。

[Inject]
public INewsRepository NewsRepo {get;set;}

IUnitOfWorkが作成されるたびに、INewsRepositoryも作成されます。これは、まだninjectバインディングに追加する必要があります。

于 2013-02-13T16:25:31.383 に答える