.NET核心entity framework – 在类库中为Context添加迁移

我在向.NET Core类库中的Entity Framework数据库上下文添加初始迁移时遇到问题。

当我跑:

dotnet ef migrations add migrationName -c PlaceholderContext 

我收到错误:

 Could not invoke this command on the startup project 'Placeholder.Data'. This version of the Entity Framework Core .NET Command Line Tools does not support commands on class library projects in ASP.NET Core and .NET Core applications. See http://go.microsoft.com/fwlink/?LinkId=798221 for details and workarounds. 

所以我点击了链接 ,了解到无法将迁移添加到类库中。 但是,您可以将类库项目转换为“app”项目,但通过这样做,我无法从业务层(类库)引用此“app”项目。

项目结构:

Placeholder.Web (WebAPI)=> Placeholder.Business (类库)=> Placeholder.Data (类库)

项目结构

Placeholder.Web => Startup.cs

  public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); services.AddMvc(); //HERE WE REGISTER DB CONTEXT, (STATIC CLASS IN BUSINESS LAYER) services.InjectBusinessContext(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=Placeholder;Integrated Security=True;Connect Timeout=30;"); services.InjectWebServices(); services.InjectBusinessServices(); } 

我怎样才能克服这个烦人的问题呢?

更新(1)

我已将我的Pl​​aceholder.Data类库转换为带有静态main方法的“app”。 因为我不能再从Placeholder.Business引用Placeholder.Data,所以我必须使用microsoft doc页面上列出的解决方法2。 当我现在运行迁移脚本时,我得到以下内容:

没有为此DbContext配置数据库提供程序。 可以通过覆盖DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext来配置提供程序。 如果使用AddDbContext,那么还要确保您的DbContext类型在其构造函数中接受DbContextOptions对象并将其传递给DbContext的基础构造函数

Doh ofcourse这不会工作,dbcontext是从我的Placeholder.Web应用程序注册的(通过业务层)。 然后我唯一的选择是在新的静态main方法中添加一个新的上下文,我真的不想这样做..

您无需将数据项目“转换”为应用程序。 这是一个具有类似结构的测试应用程序:

项目结构

在Data项目的project.json中,添加asp.net核心nuget包。

project.json

现在,要创建迁移,只需右键单击Data项目,选择’在文件资源管理器中打开文件夹’,然后在文件资源管理器中,按Shift +右键单击并在此处打开命令窗口。

要创建迁移,只需将“启动项目”指定为Web应用程序(startup.cs所在的位置)

 dotnet ef --startup-project ../TestPatterns2.Web migrations add Second 

迁移

瞧,移民:

第二次迁移

将迁移文件夹添加到数据项目中:当您定义服务时,添加迁移点,如此

 services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("TestPatterns2.Data"))); 

它只需要是一个用于进行迁移的应用程序(需要一个入口点),因此在将库作为应用程序并创建迁移之后,请注释project.json中的buildOptionsruntimes元素。 它现在将再次构建为库。

无论何时需要添加其他迁移,都要取消注释。