2011-06-10 113 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綁定。