.net 如何为多个上下文启用EF迁移以分离数据库?

eqoofvh9  于 2023-01-18  发布在  .NET
关注(0)|答案(8)|浏览(118)

如何为同一个项目中的多个DB上下文启用Entity Framework 5(版本5.0.0)迁移,其中每个上下文对应于其自己的数据库?当我在PM控制台(Visual Studio 2012)中运行Enable-Migrations时,由于存在多个上下文,出现错误:

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.

kh212irz

kh212irz1#

对Enable-Migrations的第二次调用失败,因为Configuration.cs文件已存在。如果重命名该类和文件,应该能够运行第二次Enable-Migrations,这将创建另一个Configuration.cs。
然后,您需要指定更新数据库时要使用的配置。

Update-Database -ConfigurationTypeName MyRenamedConfiguration
nszi6y05

nszi6y052#

除了@ckal建议的之外,为每个重命名的Configuration.cs提供自己的命名空间至关重要。如果不这样做,EF将尝试将迁移应用到错误的上下文。
以下是对我来说行之有效的具体步骤。
如果迁移混乱不堪,您希望创建新的"基准":
1.删除迁移文件夹中的所有现有. cs文件
1.在SSMS中,删除__MigrationHistory系统表。
创建初始迁移:
1.在程序包管理器控制台中:

Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne
-StartupProjectName NameOfMainProject  -ConnectionStringName ContextA

1.在解决方案资源管理器中:将Migrations.Configuration.cs重命名为Migrations.ConfigurationA.cs。如果使用Visual Studio,这应该会自动重命名构造函数。请确保它已重命名。编辑ConfigurationA.cs:将命名空间更改为NamespaceOfContext。迁移。迁移A
1.

Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne
-StartupProjectName NameOfMainProject  -ConnectionStringName ContextB

1.在解决方案资源管理器中:将Migrations.Configuration.cs重命名为Migrations.ConfigurationB.cs。同样,请确保构造函数也被相应地重命名。将命名空间更改为NamespaceOfContext. Migrations. MigrationsB
1.

add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName
ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne
-StartupProjectName NameOfMainProject  -ConnectionStringName ContextB
Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
-ConnectionStringName ContextB
add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName
ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName
NameOfMainProject  -ConnectionStringName ContextA
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。
1.对所需的本地数据库运行脚本,或运行不带-Script的Update-Database以在本地应用:

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

或─

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

ni65a41a3#

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

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

EDIT:(由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日:**我使用EF 7版本7.0.0-rc 1 -16348进行了一些测试

我不能得到-哦|--outputDir选项起作用。它继续给出Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
但是,它看起来像是第一次添加迁移时,它被添加到Migrations文件夹中,而另一个上下文的后续迁移会自动放入迁移的子目录中。
原来的名称ContextA似乎违反了一些命名约定,所以我现在使用ContextAContextContextBContext。(请注意,我的dnx仍然可以从软件包管理器控制台工作,我不喜欢打开一个单独的CMD窗口来进行迁移)

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

这将在ContextAContextMigrations文件夹中创建模型快照和初始迁移。它将创建一个名为ContextB的文件夹,其中包含ContextBContext的这些文件
我手动添加了一个ContextA文件夹,并将ContextAContext中的迁移文件移到该文件夹中,然后重命名了这些文件中的名称空间(快照文件、初始迁移,请注意,在初始迁移文件下还有第三个文件... designer.cs),我必须将.ContextA添加到名称空间中,然后框架再次自动处理它。
使用以下命令将为每个上下文创建新迁移

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

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

sczxawaw

sczxawaw4#

如果您已经有一个包含许多迁移的"配置",并且希望保持原样,则可以始终创建一个新的"配置"类,并为其指定另一个名称,例如

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

然后发出命令

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

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

Update-Database -ConfigurationTypeName MyNewContextConfiguration

好的。
您不需要处理Enable-Migrations,因为它会抱怨"Configuration"已经存在,并且重命名现有的Configuration类会给迁移历史记录带来问题。
您可以针对不同的数据库,也可以针对同一个数据库,所有配置都将很好地共享__MigrationHistory表。

1l5u6lss

1l5u6lss5#

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

Add-Migration Starter -context EnrollmentAppContext
  • “Starter”是迁移名称
  • “EnrollmentAppContext”是我的应用程序上下文的名称

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

b0zn9rqh

b0zn9rqh6#

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

Update-Database -context EnrollmentAppContext
  • 如果存在多个数据库,则仅使用此代码,否则不需要。
ukxgm1gy

ukxgm1gy7#

EF 4.7实际上在您在多个上下文中运行Enable-migrations时给出了提示。
在程序集“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.
x8goxv8g

x8goxv8g8#

对于EF Core中的多个DbContext;最简单的方法,至少对我这个新手来说:
1.创建2个不同的DbContext,您可以使用相同的数据库,但使用2个不同的连接字符串。
1.使用@Ahamed AAQIB答案运行每个迁移:“添加迁移迁移名称上下文注册应用上下文”“更新数据库上下文注册应用上下文”

相关问题