2011-06-10 73 views
3

我回想了一个问题,回想一下当我是union两个实体集合时,为什么默认的相等比较器似乎不工作。EF DbContext和Ninject

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(); 

但是,当我从上一个问题再次尝试我的联合时,我仍然收到重复的实体!我做错了什么?我怎么知道我是否在一个请求中使用了相同的上下文?

+0

您可以在上下文的构造函数中设置断点?我正在使用相同的方法,并且每次请求都使用上下文,就像您一样 – Gluip 2011-07-24 10:30:03

回答

4

因为当构建每个存储库时,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; 
     }  
} 
-1

为了提高feanz的解决方案,我仍然会做INewsRepository财产注射Ninject:

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

每一个IUnitOfWork创建时间有还创建了一个INewsRepository。这仍然必须添加到您的ninject绑定。