125

如何为同一项目中的多个 DB 上下文启用 Entity Framework 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.

4

7 回答 7

130

对 Enable-Migrations 的第二次调用失败,因为 Configuration.cs 文件已经存在。如果重命名该类和文件,您应该能够运行第二个 Enable-Migrations,这将创建另一个 Configuration.cs。

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

Update-Database -ConfigurationTypeName MyRenamedConfiguration
于 2012-11-20T16:08:39.077 回答
104

除了@ckal 的建议之外,为每个重命名的 Configuration.cs 提供自己的命名空间也很重要。如果不这样做,EF 将尝试将迁移应用到错误的上下文。

以下是适合我的具体步骤。

如果迁移搞砸了,并且您想创建一个新的“基线”:

  1. 删除 Migrations 文件夹中的所有现有 .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
    

    可以重新运行此命令,直到将更改应用于数据库。

  2. 对所需的本地数据库运行脚本,或者运行不带 -Script 的 Update-Database 以在本地应用:

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

    或者 -

    Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    
于 2014-01-28T06:58:05.637 回答
84

我刚刚遇到了同样的问题,我使用了以下解决方案(全部来自包管理器控制台)

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

这将在 Migrations 文件夹中创建 2 个单独的文件夹。每个都将包含生成的Configuration.cs文件。不幸的是,您仍然必须重命名这些Configuration.cs文件,否则会抱怨有两个文件。我将文件重命名为ConfigA.csConfigB.cs

编辑:(由 Kevin McPheat 提供)记住重命名 Configuration.cs 文件时,还要重命名类名和构造函数/EDIT

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

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

这将在配置文件旁边的文件夹中创建用于迁移的代码文件(将这些文件放在一起很好)

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

最后但并非最不重要的一点是,这两个命令会将正确的迁移应用到它们对应的数据库中。

编辑 2016 年 2 月 8 日: 我对 EF7 版本 7.0.0-rc1-16348 做了一些测试

我无法使 -o|--outputDir 选项起作用。它继续给予Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument

但是,看起来第一次添加迁移时,它会被添加到 Migrations 文件夹中,而随后针对另一个上下文的迁移会自动放入迁移的子文件夹中。

原始名称ContextA似乎违反了一些命名约定,所以我现在使用ContextAContextand ContextBContext。使用这些名称,您可以使用以下命令:(请注意,我的 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"

并将生成的文件放在正确的文件夹中。

于 2015-10-07T13:16:51.340 回答
7

如果您已经有一个包含许多迁移的“配置”并希望保持原样,您可以随时创建一个新的“配置”类,给它另一个名称,例如

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

然后只需发出命令

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

EF 将毫无问题地支持迁移。最后更新你的数据库,从现在开始,如果你不告诉他你要更新哪个配置,EF 会抱怨:

Update-Database -ConfigurationTypeName MyNewContextConfiguration 

完毕。

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

您可以针对不同的数据库,也可以针对同一个数据库,所有配置都将很好地共享 __MigrationHistory 表。

于 2016-05-24T14:33:15.970 回答
4

如果存在更多数据库,请在 PowerShell 中使用以下代码

Add-Migration Starter -context EnrollmentAppContext 
  • 'Starter' 是迁移名称

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

您可以通过执行以下操作在 VS 中打开 PowerShell: Tools->NuGet Package Manager->Package Manager Console

于 2019-03-12T06:41:51.337 回答
4

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

Update-Database -context EnrollmentAppContext

*如果存在多个数据库仅使用此代码,否则不需要..

于 2019-03-12T06:45:26.470 回答
0

当您在多个上下文中运行 Enable-migrations 时,EF 4.7 实际上会给出提示。

在程序集“Service.Domain”中发现了一种以上的上下文类型。

To enable migrations for 'Service.Domain.DatabaseContext.Context1', 
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context1.
To enable migrations for 'Service.Domain.DatabaseContext.Context2',
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context2.
于 2019-09-06T13:37:13.550 回答