我有一个脚手架问题,并且使用多个DBContexts从一个类库进行迁移。我发现一个类似于迁移的命令行参数:EF 7使用多个DBContext进行迁移
dnx ef migration add -c Contexts.IndustryContext initial
但是这甚至不能通过命令行解析器得到。我希望我的所有DBContext和数据库的东西不在主MVC 6 Web项目中,并在他们自己的DLL中。这可能吗?需要什么命令行魔术?
我有一个脚手架问题,并且使用多个DBContexts从一个类库进行迁移。我发现一个类似于迁移的命令行参数:EF 7使用多个DBContext进行迁移
dnx ef migration add -c Contexts.IndustryContext initial
但是这甚至不能通过命令行解析器得到。我希望我的所有DBContext和数据库的东西不在主MVC 6 Web项目中,并在他们自己的DLL中。这可能吗?需要什么命令行魔术?
我正在寻找这个问题的答案,并希望为我的核心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.EntityFrameworkCore
和Microsoft.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
文件夹。
最新版本的命令行工具(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
我还没有试过把数据层在一个单独的项目,但我确实有多重DbContexts在一个Web API项目中。它也应该与单独的项目一起工作。
使用最新的语法(V1.0.0),创建你这样的迁移:
dotnet ef migrations add <migration-name> -o <output-directory> -c <context>
哪里<context>
是你的DbContext的全类名 - 样MyProject.Data.MyDbContext
我把我的将不同的上下文迁移到不同的目录中,但我认为你不必这样做。只要确保它们具有不同的migration-name
值。
更新工具引用新发布的指令: https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#update-net-core-cli-tools –
@Todd Skeleton,感谢您的一些提示:#1使用单独的数据库上下文工厂的每个数据库上下文类&#2从地址栏调用命令提示符(至少这是我第一次学习这个技巧)。 – blogs4t
但是,我有一个问题,请您澄清为什么您为--startup-project选项提供了migrations.console项目。另外,如果你可以请,澄清 - 项目和 - 启动项目选项意味着什么? – blogs4t