我对EF7相对较新,并且听说过将DbContexts的依赖注入到Controller构造函数中是一个很好的方法,可以在给定的Action方法中使用DbContext。但是,在许多情况下,依赖注入是不可能的(例如,在普通类中访问Db),并且必须使用using(VectorDbContext dbContext...)
模式。
我遇到了一个问题,即向依赖注入的上下文无法访问使用using
模式创建的DbContext添加数据。 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始终为空!
我做错了什么?似乎DbContexts在某种程度上不同步,依赖注入如何创建DbContext /它来自何处?
编辑:我刚做了一些额外的测试,并确认在使用new
创建的DbContext中添加的任何实体仅在new
中可见,并且在注入的DbContext中添加的实体仅在注入的DbContext,让我相信他们正在连接到不同的后备数据库,但我无法确认。
答案 0 :(得分:2)
我可能错了,但我的假设是,当您在代码中创建DbContext
的新实例时,您正在使用无参数构造函数将基础连接字符串设置为某个默认值。但是,注入DI DbContext
可以使用另一个显式传递不同连接字符串的构造函数来解析。
这是Unity配置的一个示例,它明确指定了构造函数参数:
<register type="DbContext, [assembly-name]" mapTo="DbContext, [assembly-name]">
<constructor>
<param name="nameOrConnectionString" value="Test"/>
</constructor>
</register>
所以我会检查你容器的配置。