我刚才问了一个问题,为什么当我联合两个实体集合时,默认的相等比较器似乎不起作用。
EF Code First - Linq to Entities Union EqualityComparer
答案是因为我使用了两个不同的dbcontext实例,因此引用不同。
所以现在我试图在请求中共享我的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) {
      ...
   }
}

然后在我的两个存储库(NewsRepository和CategoryRespository)中,我将IDBContext作为构造函数参数
IDbContext _db;

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

所以现在我假设如果我将IDBContext绑定到请求作用域中的siteContext,那么我的存储库将共享相同的上下文?
 kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope();

然而,当我再次尝试我的联盟从上一个问题我仍然收到重复的实体!我做错什么了?如何判断我是否在一个请求中使用了相同的上下文?

最佳答案

因为当构建每个存储库时,ninject将为每个存储库提供一个新的sitecontext实例。这就是它不起作用的原因。使用UnitOfWork实现是个好主意,这意味着所有存储库都使用相同的上下文。
这项工作将在IDB环境下进行。
像这样的东西会有用的

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;
         }
}

10-08 13:05