實體框架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中刪除這些引用。
    Build現在應該成功,您可以啟動Web應用程序。

如何使用ef遷移:

在命令行中,轉到WebProject的目錄(而不是DataAccess項目)。所有的ef命令都可以在這裡正常工作。

要將新遷移添加到DataAccess項目的Migrations文件夾,需要使用-p標誌。喜歡,
dnx ef migrations add Sample -p DataAccess

出現此問題是因為命令是從DataAccess項目中的cmd運行的。初始化所有服務的啟動類位於WebProject中。當您嘗試從DataAccess目錄運行命令時,將識別dnx ef因為引用了EntityFramework.Commands但是當您嘗試使用遷移時,服務未初始化,因此它將無法拋出異常。


熱門答案

嘗試將Context類移動到“DataAccess”項目,並在“DataAccess”項目中覆蓋Context的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": "**********"
    }
  }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow