Entity Framework 7データベースプロバイダが設定されていない=>移行を別のプロジェクトに移動すると

asp.net-core c# entity-framework-core

質問

私はEF7が初めてです。私はこれが重複する質問であることを知っています:

データベースプロバイダは設定されていませんEF7

しかし、あなたがこの質問を閉じたままにする前に待って...

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

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

  services.AddScoped<TestRepository, TestRepository>();

今度はEFプロジェクトのcmdウィンドウでdnx ef database updateコマンドを実行し、このエラーが表示されます。

C:\TGB.DataAccess>dnx ef database update
System.InvalidOperationException: No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.
   bei Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)
   bei Microsoft.Data.Entity.Internal.DbContextServices.<>c__DisplayClass6_0.<Initialize>b__0()
   bei Microsoft.Data.Entity.Internal.LazyRef`1.get_Value()
   bei Microsoft.Data.Entity.Internal.DbContextServices.get_DatabaseProviderServices()
   bei Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c.<AddEntityFramework>b__0_8(IServiceProvider p)
   bei Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass12_0.<RealizeService>b__0(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
   bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService[T](IServiceProvider provider)
   bei Microsoft.Data.Entity.Design.Internal.DesignTimeServicesBuilder.Build(DbContext context)
   bei Microsoft.Data.Entity.Design.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   bei Microsoft.Data.Entity.Commands.Program.Executor.<>c__DisplayClass7_0.<UpdateDatabase>b__0()
   bei Microsoft.Data.Entity.Commands.Program.Executor.Execute(Action action)
No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.

今私は上に貼り付けられたソリューションリンクに従って、私のApplicationDbContextのコンストラクタを変更しようとしました:

それは私のコード:

私のApplicationDbContext.csは実際には空です。つまり、私が上書きしたことは何も意味しません。

基本クラスの基本クラスを見ると、パラメータDbContextOptionsを持つオーバーロードされたコンストラクタがありますが、コンストラクタから何も渡せません。

  //
        // Summary:
        //     Initializes a new instance of Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext.
        //
        // Parameters:
        //   options:
        //     The options to be used by a Microsoft.Data.Entity.DbContext.
        public IdentityDbContext(DbContextOptions options);

私の側で何が壊れていますか?私はEF 7 RC1とdnx 451を使用しています。

これは、ApplicationDbContext / ApplicationUserとMigrationsフォルダ全体を余分に移動して「DataAccess」プロジェクトと言うときにのみ発生します。その後、すべてが壊れているようです。

受け入れられた回答

  1. Webアプリケーションテンプレート(認証:個人ユーザーアカウント)を使用して、 "WebProject"という名前の新しいASP.NET Webアプリケーションを作成します。

  2. 次に、別のプロジェクトを "DataAccess"という名前のソリューションに追加します(これは関連性のないクラスライブラリタイプです)

  3. 次に、ApplicationDbContext / ApplicationUserファイルと移行フォルダをDataAccessプロジェクトに移動します。

  4. この段階でビルドが失敗するので、project.jsonを正しい参照に合わせて修正する必要があります。

  5. DataAccessプロジェクトの場合は、次の依存関係を追加します

    "dependencies": {
        "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
        "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
    }
    
  6. WebProjectの場合は、 DataAccessを依存関係として追加します。 DataAccessは上記2つのパッケージを参照しているため、これらの参照をWebProjectから削除できます。
    ビルドが成功し、Webアプリケーションを起動できます。

ef移行の使い方:

コマンドラインで、WebProjectのディレクトリに移動します(DataAccessプロジェクトではありません)。すべてのefコマンドはここからうまく動作します。

DataAccessプロジェクトのMigrationsフォルダに新しい移行を追加するには、 -pフラグを使用する必要があります。同様に、
dnx ef migrations add Sample -p DataAccessます。

コマンドはDataAccessプロジェクト内のcmdから実行されるため、問題が発生します。すべてのサービスを初期化しているスタートアップクラスはWebProjectにあります。 dnx efディレクトリからコマンドを実行しようとすると、 EntityFramework.Commandsが参照されているのでdnx efが認識されますが、移行を使用しようとするとサービスは初期化されないため、上記の例外は発生しません。


人気のある回答

Contextクラスを "DataAccess"プロジェクトに移動し、 "DataAccess"プロジェクトのコンテキストのOnConfiguringメソッドをオーバーライドして、移行を実行してください。

public partial class MyContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***");
    }
}

また、接続文字列をハードコードしたくない場合は、次のようにすることもできます。 DIがあなたにオプションを注入します。

public partial class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options) : base(options)
    {

    }
}

あなたのStartup.csで。

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddEntityFramework()
        .AddSqlServer()            
        .AddDbContext<WtContext>(options =>
            options.UseSqlServer(Configuration["Data:MyDb:ConnectionString"]));
}

あなたのappsetting.json;

{
  "Data": {
    "MyDb": {
      "ConnectionString": "**********"
    }
  }
}


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