具有多个DBContexts的EF 7迁移

时间:2015-12-02 03:49:20

标签: entity-framework-core

我有一个问题脚手架,并从具有多个DBContexts的类库进行迁移。我找到了一个类似于迁移的命令行参数:

dnx ef migration add -c Contexts.IndustryContext initial

但是这甚至不能通过命令行解析器获得。我希望我的所有DBContexts和数据库内容都来自主MVC 6 Web项目和他们自己的DLL。这可能吗?需要什么命令行魔法?

3 个答案:

答案 0 :(得分:4)

我一直在寻找这个问题的答案,并希望为ef core 2.0提供我的解决方案。

Microsoft.EntityFrameworkCore.Tools.DotNet需要添加到其中包含DbContext的每个类库中。右键单击该项目,然后选择Edit *.csproj。然后,添加以下内容:

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview2-final" />
  </ItemGroup>

注意:该版本是本文发布时的最新版本,将来可能会发生变化。

接下来,我创建了一个名为Migrations.Console的新控制台应用程序(.NET Core)并将其添加到我的解决方案中。您必须在此项目中引用所有DbContext类库。

我安装了Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.Design Nuget包。

Migrations.Console应用程序中,我为每个Db上下文创建了一个DbContextFactory类。

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;

public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
    public ApplicationDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
        builder.UseSqlServer("Server=(local);Database=DATABASENAME;Trusted_Connection=True;MultipleActiveResultSets=true");
        return new ApplicationDbContext(builder.Options);
    }
}

注意:确保更新上下文和连接字符串以匹配您的项目。

现在每个DbContextFactory都已创建,您可以开始创建迁移。转到类库的文件夹。右键单击项目和Open Folder in File Explorer的最简单方法。然后,在cmd的地址栏中键入File Explorer,以在该文件夹中打开命令提示符。

现在使用以下命令创建迁移:

dotnet ef migrations add InitialCreate -c ApplicationDbContext --startup-project ../Migrations.Console/Migrations.Console.csproj

注意:更改ApplicationDbContext以匹配您正在使用的上下文的名称。此外,如果您通过其他名称调用控制台项目,则需要更改路径和名称。

您现在应该在类库中看到Migrations文件夹。

答案 1 :(得分:3)

我还没有尝试将数据层放在一个单独的项目中,但我在一个Web API项目中确实有多个DbContexts。它也应该与单独的项目一起使用。

使用最新语法(v1.0.0),您可以创建以下迁移:

dotnet ef migrations add <migration-name> -o <output-directory> -c <context>

<context>是DbContext的完整类名 - 例如MyProject.Data.MyDbContext

我将针对不同上下文的迁移放入不同的目录中,但我认为您不必这样做。只需确保它们具有不同的migration-name值。

答案 2 :(得分:1)

命令行工具的最新版本(RC1 update 1)支持以下语法:

Usage: dnx ef dbcontext scaffold [arguments] [options]

Arguments:
  [connection]  The connection string of the database
  [provider]    The provider to use. For example, EntityFramework.MicrosoftSqlServer

Options:
  -a|--data-annotations                 Use DataAnnotation attributes to configure the model where possible. If omitted, the output code will use only the fluent API.
  -c|--context <name>                   Name of the generated DbContext class.
  -o|--output-dir <path>                Directory of the project where the classes should be output. If omitted, the top-level project directory is used.
  -s|--schema <schema_name.table_name>  Selects a schema for which to generate classes.
  -t|--table <schema_name.table_name>   Selects a table for which to generate classes.
  -p|--target-project <project>         The project to scaffold the model into. If omitted, the current project is used.
  -e|--environment <environment>        The environment to use. If omitted, "Development" is used.
  -v|--verbose                          Show verbose output
  -?|-h|--help                          Show help information