【问题标题】:EF 7 Migrations with multiple DBContexts具有多个 DBContext 的 EF 7 迁移
【发布时间】:2017-07-14 02:22:46
【问题描述】:

我在搭建和从具有多个 DBContext 的类库迁移时遇到问题。我为迁移找到了一个如下所示的命令行参数:

dnx ef migration add -c Contexts.IndustryContext initial

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

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    我正在寻找这个问题的答案,并想为 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。然后,在File Explorer 的地址栏中键入cmd 以在该文件夹中打开命令提示符。

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

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

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

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

    【讨论】:

    • 新发布的工具参考更新说明:docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/…
    • @Todd Skeleton,感谢您提供的一些提示:#1 每个数据库上下文类使用单独的数据库上下文工厂和#2 从地址栏调用命令提示符(至少这是我第一次学习这个技巧)。
    • 但是,我有一个问题,您能否澄清一下为什么您为 --startup-project 选项提供了 migrations.console 项目。另外,如果可以的话,请澄清 --project 和 --startup-project 选项的含义。?
    • --startup-project 不能是类库。它必须是您可以实际运行的项目。这是ef migration 工具用于连接数据库的项目。 --project 选项是您希望将迁移输出添加到的实际项目 - 在这种情况下 - 您的类库。
    【解决方案2】:

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

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

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

    &lt;context&gt; 是您的 DbContext 的完整类名,例如 MyProject.Data.MyDbContext

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

    【讨论】:

      【解决方案3】:

      命令行工具的最新版本(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
      

      【讨论】:

        猜你喜欢
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-10
        • 1970-01-01
        相关资源
        最近更新 更多