如何启用多个上下文来单独的数据库迁移EF?(How do I enable EF migration

2019-06-21 05:28发布

如何启用实体框架5(5.0.0)的多个数据库环境迁移,在同一项目中,其中每个上下文对应于它自己的数据库? 当我运行Enable-Migrations在PM控制台(的Visual Studio 2012),还有因为是多个上下文的错误:

PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.

如果我运行Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext我不能运行Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext因为迁移已经存在: Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter. Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.

Answer 1:

第二个呼叫启用的迁移失败,因为Configuration.cs文件已经存在。 如果您重命名类和文件,你应该能够运行的第二个启用的迁移,这将创造另一个Configuration.cs。

然后,您需要指定要在更新数据库时要使用的配置。

Update-Database -ConfigurationTypeName MyRenamedConfiguration


Answer 2:

除了@ckal建议是什么, 关键是给每个改名Configuration.cs自己的命名空间。 如果不这样做,EF将尝试迁移应用到错误的上下文。

这里是为我工作很好的具体步骤。

如果迁移搞乱了,你要创建一个新的“底线”:

  1. 删除任何现有的.cs在迁移文件夹中的文件
  2. 在SSMS中,删除__MigrationHistory系统表。

创建初始迁移:

  1. 在包管理器控制台:

     Enable-Migrations -EnableAutomaticMigrations -ContextTypeName NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA 
  2. 在解决方案资源管理:重命名Migrations.Configuration.cs到Migrations.ConfigurationA.cs。 如果使用Visual Studio这应该自动重命名的构造函数。 确保它。 编辑ConfigurationA.cs:更改命名空间NamespaceOfContext.Migrations.MigrationsA

  3.  Enable-Migrations -EnableAutomaticMigrations -ContextTypeName NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB 
  4. 在解决方案资源管理:重命名Migrations.Configuration.cs到Migrations.ConfigurationB.cs。 同样,确保构造也适当地重命名。 编辑ConfigurationB.cs:更改命名空间NamespaceOfContext.Migrations.MigrationsB

  5.  add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB 
  6.  Update-Database -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB 
  7.  add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA 
  8.  Update-Database -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA 

步骤软件包管理器控制台创建迁移脚本:

  1. 运行命令

     Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA 

    要么 -

     Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB 

    它是确定之前更改应用于DB重新运行该命令。

  2. 无论是对运行所需的本地数据库的脚本,或运行更新,数据库没有-Script在本地应用:

     Update-Database -ConfigurationTypeName ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextA 

    要么 -

     Update-Database -ConfigurationTypeName ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject -ConnectionStringName ContextB 


Answer 3:

我只是碰到了同样的问题,我用以下解决方案(全部由包管理器控制台)

PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextA" -ContextTypeName MyProject.Models.ContextA
PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextB" -ContextTypeName MyProject.Models.ContextB

这将创建在迁移文件夹2个单独的文件夹。 每个将包含生成Configuration.cs文件。 不幸的是,你还是要重命名这些Configuration.cs文件,否则将有大约有两个人的投诉。 我重新命名文件ConfigA.csConfigB.cs

编辑 :(礼貌凯文McPheat)记住重命名Configuration.cs文件时,也重命名类名和构造函数/ EDIT

有了这个结构,你可以简单地做

PM> Add-Migration -ConfigurationTypeName ConfigA
PM> Add-Migration -ConfigurationTypeName ConfigB

这将为旁边的配置文件的文件夹内迁移的代码文件(这是好的,保持这些文件一起)

PM> Update-Database -ConfigurationTypeName ConfigA
PM> Update-Database -ConfigurationTypeName ConfigB

最后但并非最不重要的这两个命令都将正确迁移到他们的corrseponding数据库。

编辑2016年2月8日:我已经做了与EF7版本7.0.0-rc1-16348一个小测试

我不能让-o | --outputDir选项工作。 它不停地给Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument

然而,它看起来像第一次加入的迁移它被添加到迁移文件夹,以及用于另一上下文随后的迁移被自动放入迁移的subdolder。

原来的名字ContextA似乎违背了一些命名约定,所以我现在用ContextAContextContextBContext 。 使用这些名字,你可以使用下面的命令:(注意,我仍然DNX从包管理器控制台的工作,我不喜欢开一个单独的CMD窗口做迁移)

PM> dnx ef migrations add Initial -c "ContextAContext"
PM> dnx ef migrations add Initial -c "ContextBContext"

这将创建一个模型快照,并在一个初始迁移Migrations的文件夹ContextAContext 。 这将创建一个名为文件夹ContextB包含这些文件ContextBContext

我手动添加一个ContextA文件夹,并移离迁移文件ContextAContext到该文件夹。 于是我改名这些文件里面的命名空间(快照文件,最初的迁移和注意,初始迁移文件下的第三个文件... designer.cs)。 我不得不添加.ContextA到命名空间,并从那里框架再次自动处理它。

使用以下命令将创建为每个上下文新的迁移

PM>  dnx ef migrations add Update1 -c "ContextAContext"
PM>  dnx ef migrations add Update1 -c "ContextBContext"

和生成的文件放在正确的文件夹。



Answer 4:

如果你已经有了一个“配置”与许多迁移,并希望保持这种作为是,你总是可以创建一个新的“配置”类,给它一个名称,如

class MyNewContextConfiguration : DbMigrationsConfiguration<MyNewDbContext>
{
   ...
}

然后就发出命令

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

和EF将脚手架没有问题的迁移。 最后,更新数据库,从现在开始,如果你不告诉他你要更新其配置,EF会抱怨:

Update-Database -ConfigurationTypeName MyNewContextConfiguration 

完成。

你并不需要处理启用的迁移,因为它会抱怨“配置”已经存在,并重命名现有的配置类会带来问题,迁移历史。

你可以针对不同的数据库,或者同一家,所有的配置将很好地共享__MigrationHistory表。



Answer 5:

要更新以下PowerShell中的代码数据库类型...

Update-Database -context EnrollmentAppContext

*如果超过一个数据库中存在只能用这个代码,否则没有必要..



Answer 6:

如果有更多的数据库中存在以下使用PowerShell中码

Add-Migration Starter -context EnrollmentAppContext 
  • “入门”是迁移名称

  • “EnrollmentAppContext”是我的应用程序上下文的名称

:您可以通过在VS打开的PowerShell Tools->NuGet Package Manager->Package Manager Console



文章来源: How do I enable EF migrations for multiple contexts to separate databases?