在填充使用new創建的DbContext(EF7,ASP.NET 5,vnext)後,Dependancy Injected DbContext為空

asp.net asp.net-core dbcontext entity-framework entity-framework-core

我是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中的訪問代碼:

using (ExampleDbContext dbContext= new ExampleDbContext()) {
    dbContext.Things.Add(
        new Thing() {
            Stuff= "something"
        });

    dbContext.SaveChanges();
}

單步執行時,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>

所以我會檢查你的容器的配置。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因