我对 EF7 比较陌生,并且听说将 DbContext 依赖注入(inject)到 Controller 构造函数中是获取 DbContext 以在给定 Action 方法中使用的好方法。然而,很多情况下依赖注入(inject)是不可能的(例如,访问普通类中的 Db),必须使用 using(VectorDbContext dbContext...)
模式。
我遇到了一个问题,即向使用 using
模式创建的 DbContext 添加数据无法由依赖注入(inject)的上下文访问。 DbContext 是一个用于测试的简单 InMemory 数据库 - 它不连接到任何东西。
这里是将实体添加到 DbContext 的代码,为了测试我在 Startup.cs 中调用它:
using (ExampleDbContext dbContext= new ExampleDbContext()) {
dbContext.Things.Add(
new Thing() {
Stuff= "something"
});
dbContext.SaveChanges();
}
这是 Controller 内的访问代码:
public class ExampleController : Controller {
public ExampleController(ExampleDbContext exampleDbContext) {
this.ExampleDbContext= exampleDbContext;
}
public ExampleDbContext ExampleDbContext { get; set; }
public async Task<IActionResult> ExampleAction() {
// new DbContext:
using(ExampleDbContext dbContext = new ExampleDbContext ()) {
var List1 = (await dbContext.Things
.AsNoTracking()
.ToListAsync());
}
// Injected DbContext:
var List2 = (await this.ExampleDbContext.Things
.AsNoTracking()
.ToListAsync());
}
}
单步执行时,List1 中包含预期的一项,但 List2 始终为空!
我做错了什么?看起来 DbContext 不知何故不同步,依赖注入(inject)如何创建 DbContext/它来自哪里?
编辑:我刚刚做了一些额外的测试,并确认在使用 new
创建的 DbContext 中添加的任何实体仅在 new
中可见,并且在注入(inject)的 DbContext 仅在注入(inject)的 DbContext 内可见,这让我相信它们正在连接到不同的支持数据库,但我无法确认。
最佳答案
我可能是错的,但我的假设是,当您在代码中创建 DbContext
的新实例时,您正在使用无参数构造函数将底层连接字符串设置为某个默认值。但是,DI 注入(inject)的 DbContext
可以使用另一个构造函数来解析,并显式传入不同的连接字符串。
这是显式指定构造函数参数的 Unity 配置示例:
<register type="DbContext, [assembly-name]" mapTo="DbContext, [assembly-name]">
<constructor>
<param name="nameOrConnectionString" value="Test"/>
</constructor>
</register>
所以我会检查您的容器的配置。
关于asp.net - 填充使用 new 创建的 DbContext(EF7、ASP.NET 5、vnext)后,依赖项注入(inject) DbContext 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28209392/