Dependancy Injected DbContextは、新しい(EF7、ASP.NET 5、vnext)で作成されたDbContextを作成した後は空です。

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

質問

私は比較的新しいEF7です。コントローラコンストラクタへのDbContextsのDependency Injectionは、DbContextを与えられたActionメソッド内で使用するための良い方法です。しかし、Dependency Injectionが不可能な状況(例えば、通常のクラスで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();
}

コントローラ内のアクセスコードは次のとおりです。

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には期待されるアイテムが1つありますが、List2は常に空です!

私は間違って何をしていますか?何らかの形でDbContextが同期していないように見えますが、Dependency InjectionはDbContextをどのように作成しますか/それはどこから来ますか?

編集:私はいくつかの追加のテストを行なったし、DbContext以内に追加されたエンティティがで作成したことが確認されているnewでのみ表示されnew 、そして注入DbContext以内に添加するエンティティが注入DbContext内のみ表示され、それが接続されていると信じて私をリード異なるバッキングデータベースには、私は確認することはできません。

受け入れられた回答

私は間違っているかもしれませんが、私の前提は、コードでDbContext新しいインスタンスを作成するときに、デフォルトの接続文字列をデフォルト値に設定するパラメータのないコンストラクタを使用していることです。しかし、DI注入DbContextは、明示的に渡される異なる接続文字列を持つ別のコンストラクタを使用して解決できます。

これはコンストラクタパラメータを明示的に指定するUnity設定の例です:

<register type="DbContext, [assembly-name]" mapTo="DbContext, [assembly-name]">
<constructor>
    <param name="nameOrConnectionString" value="Test"/>
</constructor>
</register>

だから私はあなたのコンテナの構成をチェックします。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ