我回答了一个问题,为什么当我联合两个实体集合时,默认的相等比较器似乎不起作用。
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 :(得分: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;
}
}
答案 1 :(得分:-1)
为了改进feanz的解决方案,我仍然会使用Ninject对INewsRepository进行属性注入:
[Inject]
public INewsRepository NewsRepo {get;set;}
每次创建IUnitOfWork时,都会创建一个INewsRepository。这仍然必须添加到您的ninject绑定中。