我是EF7的新手,並且聽說過將DbContexts的依賴注入到Controller構造函數中是一個很好的方法,可以在給定的Action方法中使用DbContext。但是,在許多情況下,依賴注入是不可能的(例如,在普通類中訪問Db),並且必須using(VectorDbContext dbContext...)
模式。
我遇到了一個問題,即using
依賴注入的上下文無法訪問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
可見,並且在Injected DbContext中添加的實體僅在Injected DbContext中可見,這使我相信它們正在連接到不同的後備數據庫,但我無法確認。
我可能錯了,但我的假設是當你在代碼中創建一個新的DbContext
實例時,你使用的是無參數構造函數,它將底層連接字符串設置為某個默認值。但是,注入DI的DbContext
可以使用另一個具有明確傳入的不同連接字符串的構造函數來解析。
這是Unity配置的一個示例,它明確指定構造函數參數:
<register type="DbContext, [assembly-name]" mapTo="DbContext, [assembly-name]">
<constructor>
<param name="nameOrConnectionString" value="Test"/>
</constructor>
</register>
所以我會檢查你的容器的配置。