gpt4 book ai didi

c# - EF DbContext 和 Ninject

转载 作者:太空狗 更新时间:2023-10-30 01:25:45 25 4
gpt4 key购买 nike

我刚才问了一个问题,为什么当我合并两个实体集合时默认的相等比较器似乎不起作用。

EF Code First - Linq to Entities Union EqualityComparer

答案是因为我使用了我的 DbContext 的两个不同实例,因此引用不同。

所以现在我正尝试在请求中共享我的 DbContent。我看到了一些“复杂”的例子,但我想我会尝试一个更简单的解决方案。

所以我创建了一个 IDbContext 接口(interface),它简单地概述了我的实体

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 绑定(bind)到 SiteContext,我的存储库将共享相同的上下文?

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

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

最佳答案

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

关于c# - EF DbContext 和 Ninject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6311974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com