ASP.net IDが同じDbContextで正常に動作しているときに、EF7がプロバイダを設定していないと言っているのはなぜですか?

asp.net-core c# ef-code-first entity-framework-core

質問

私は、ASP.net 5、MVC6、Entity Framework 7を使って実験的プロジェクトを始めました。ASP.Net Identityは正常に動作していますが、自分のデータをDbContextに追加してこの問題に遭遇しました。 EF7報告書:

要求の処理中に未処理の例外が発生しました。

InvalidOperationException:データベースプロバイダーが構成されていません。 DbContextクラスのOnConfiguringまたはサービスの設定時にAddDbContextメソッドをオーバーライドして、データベースプロバイダを構成します。

Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)スタッククエリCookieヘッダー

InvalidOperationException:データベースプロバイダーが構成されていません。 DbContextクラスのOnConfiguringまたはサービスの設定時にAddDbContextメソッドをオーバーライドして、データベースプロバイダを構成します。

私の設定方法は次のとおりです:

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);

        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();

        // Add application services.
        services.AddTransient<IEmailSender, AuthMessageSender>();
        services.AddTransient<ISmsSender, AuthMessageSender>();

        services.AddTransient<ApplicationUnitOfWork>(instance => new ApplicationUnitOfWork());
    }

ApplicationUnitOfWorkは、緊密な結合を減らすためにEF7と比較してファサードです。これまでのところすべてがあります:

public class ApplicationUnitOfWork : IUnitOfWork
    {
    readonly ApplicationDbContext dbContext;

    public ApplicationUnitOfWork()
        {
        dbContext = new ApplicationDbContext();
        Products = new ProductRepository(dbContext);
        }

    public void Dispose() { dbContext.Dispose(); }

    public IUserRepository Users { get; }

    public IRepository<SoftwareProduct> Products { get; }

    public async Task CommitAsync() { await dbContext.SaveChangesAsync(); }

    public void Cancel() { throw new NotImplementedException(); }
    }

Webアプリケーションを実行すると、ユーザーアカウントを登録してログインすることができ、EFによってデータベースが作成され、IDテーブルが作成され、ユーザーデータが移入されます。製品表も作成されています。これにより、EFはApplicationDbContextを使用して、データベースとスキーマの作成に使用するプロバイダを見つけることができます。

私が使用して私の製品コントローラ、アクセスしようとすると、しかしProductsRepository 、EFは不平を言う-にもかかわらずApplicationDbContext両方のケースで使用され、データベースを作成するために使用されました!

どうして? ASP.netアイデンティティについて何が特別なのですか?何らかの方法でプロバイダを取得できますが、自分のコードは取得できません。どのような "魔法の呪文"は私が行方不明ですか?

受け入れられた回答

それはあなたのために注入するのではなく、それを新しくしているからです。新しく作成したものは設定されていません。クラスをコンストラクタに渡すようにクラスを変更する必要があります。

DbContextには複数のコンストラクタがあり、それを構成していない空のコンストラクタを使用しています。

あなたのコンストラクタを次のようにして注入する方が良いでしょう:

 public ApplicationUnitOfWork(ApplicationDbContext context)
 {
    dbContext = context;
    Products = new ProductRepository(dbContext);
 }

あなたのコードは、ApplicationDbContextがDIに登録されていることを示しています。IDは注入されたものを使用していますが、パラメータのないコンストラクタ

ApplicationUnitOfWorkを登録して注入できるようにする必要があります。

services.AddScoped<ApplicationUnitOfWork, ApplicationUnitOfWork>();


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow