2015-12-02 32 views
0

我有一个脚手架问题,并且使用多个DBContexts从一个类库进行迁移。我发现一个类似于迁移的命令行参数:EF 7使用多个DBContext进行迁移

dnx ef migration add -c Contexts.IndustryContext initial 

但是这甚至不能通过命令行解析器得到。我希望我的所有DBContext和数据库的东西不在主MVC 6 Web项目中,并在他们自己的DLL中。这可能吗?需要什么命令行魔术?

回答

4

我正在寻找这个问题的答案,并希望为我的核心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文件夹。

+0

更新工具引用新发布的指令: https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#update-net-core-cli-tools –

+0

@Todd Skeleton,感谢您的一些提示:#1使用单独的数据库上下文工厂的每个数据库上下文类&#2从地址栏调用命令提示符(至少这是我第一次学习这个技巧)。 – blogs4t

+0

但是,我有一个问题,请您澄清为什么您为--startup-project选项提供了migrations.console项目。另外,如果你可以请,澄清 - 项目和 - 启动项目选项意味着什么? – blogs4t

1

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

我还没有试过把数据层在一个单独的项目,但我确实有多重DbContexts在一个Web API项目中。它也应该与单独的项目一起工作。

使用最新的语法(V1.0.0),创建你这样的迁移:

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

哪里<context>是你的DbContext的全类名 - 样MyProject.Data.MyDbContext

我把我的将不同的上下文迁移到不同的目录中,但我认为你不必这样做。只要确保它们具有不同的migration-name值。