Asp.net-Core-Mvc

EntityFramework 7 (EF7) 遷移。DbContext 和 StartUp Project 位於不同的程序集中

  • August 7, 2015

我正在嘗試通過 entityframework.commands 在 EF7 中使用遷移。但是我的 DbContext 與 Start-up 項目在不同的程序集中(asp.net mvc 是一個啟動項目,Core.Implementation 有一個 DbContex)。

dnx ef 遷移添加 MyMigration -c MyContext

System.InvalidOperationException:找不到名為“MyContext”的 DbContext。

我嘗試使用命名空間指向其他程序集,但它也不起作用。有可能嗎?或者我只需要將我的上下文放在 ef7 命令所在的程序集中?

根據問題#639#2256#2293#2294#2357#2553#2748,我們在該領域還有一些工作要做。:-)

編輯

由於 1.0.0-rc1-final (可能更早),這個解決方法是不必要的

  • 現在您不需要App.DataAccess/Startup.cs(如果您使用下面的解決方法,只需將其刪除)
  • 您從主項目創建/執行遷移(在這種情況下 App.Web
  • 但是,您必須指定-p包含遷移的項目(參數):

cd App.Web
dnx ef migrations add NewMigration -p App.DataAccess

如果您有多個數據庫上下文,您還必須指定使用哪一個(-c參數)

cd App.Web
dnx ef migrations add NewMigration -p App.DataAccess -c YourDbContext

編輯結束

我找到了解決方法

假設您有 2 個項目:App.WebApp.DataAccess

您可以將一個非常基本的 Startup 類添加到您的App.DataAccess

>App.Web
-->Startup.cs // your main startup
>App.DataAccess
-->path/to/ApplicationDbContext.cs
-->different/path/to/YourModels.cs
-->Startup.cs // add a simple startup class
-->project.json

簡單的啟動類 ( App.DataAccess\Startup.cs):

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.Data.Entity;
using Microsoft.Dnx.Runtime;
using Microsoft.Framework.Configuration;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.Logging;

namespace App.DataAccess
{
   public class Startup
   {
       public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
       {
           var builder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
               .AddJsonFile("../App.Web/config.json"); // path to your original configuration in Web project

           Configuration = builder.Build();
       }

       public IConfiguration Configuration { get; set; }

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

       public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
       {
       }
   }
}

比在 App.DataAccess ( App.DataAccess/project.json) 中修改你的 project.json :

{
 "version": "1.0.0-*",
 "description": "App.DataAccess Class Library",
 "authors": [ "Author" ],
 "tags": [ "" ],
 "projectUrl": "",
 "licenseUrl": "",
 "frameworks": {
   "dnx451": { }
 },

 "dependencies": {
   "EntityFramework.Commands": "7.0.0-beta7",
   "Microsoft.Framework.Configuration.Json": "1.0.0-beta7",
 },

 "commands": {
   "ef": "EntityFramework.Commands" // this line is important, it will give you access to 'dnx ef' in command line
 }
}

你所要做的就是去App.DataAccess使用dnx ef

cd App.DataAccess
dnx ef migrations add NewMigration
dnx ef migrations remove
dnx ef database update
dnx ef ...

引用自:https://stackoverflow.com/questions/31870709