具有上下文键更改的基架迁移
本文关键字:迁移 上下文 | 更新日期: 2023-09-27 18:34:22
我重组了我的项目,这导致了数据库上下文的命名空间名称和关联的代码优先配置的更改。在这一点上,我有一个基架迁移,"InitialCreate",因此我的数据库__MigrationHistory
表包含一行,其中包含一些MigrationId
和一个包含Configuration
类的命名空间名称和类名的ContextKey
。
在我移动了东西之后,执行Get-Migrations
没有返回任何结果,在按照我同事的建议更改ContextKey
后,"InitialCreate"迁移被正确枚举。
在更改期间,我应该采取哪些步骤,以免中断迁移的连续性,从而避免需要手动重命名ContextKey
?显然,对于一个应用迁移来说,这没什么大不了的,但是对于数十个应用迁移来说,这将是一个巨大的痛苦。
困了很长时间,在这里问了一遍又答。在 EF 文档中,可以在此处找到有关上下文键的说明。您应该像这样创建自定义迁移配置:
public class MyMigrationConfiguration : DbMigrationsConfiguration<MyMigrationContext>
{
public MyMigrationConfiguration ()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
MigrationsNamespace = "My.Migrations.Assembly";
MigrationsDirectory = "My/Migrations/Directory";
ContextKey = "MyContexKey"; // You MUST set this for every migration context
}
}
>我了解到DbMigrationsConfiguration{TDbContext}
类具有一个名为 ContextKey
(EF6 及其"多租户迁移"功能)的属性,它允许我显式设置上下文键。如果我在程序包管理器控制台中使用了 Enable-Migrations
命令的 -ContextTypeName
参数,则会设置此属性。
但是,在配置类类型名称更改后可以选择以这种方式设置上下文键,如果您可以容忍数据库中的某些差异,则几乎没有必要。
我有两个单独的数据库项目 - 一个包含模型和映射,另一个仅包含迁移配置和所有迁移。我已经将包含迁移的项目合并到包含模型等的项目中。
最后,我通过执行以下步骤解决了无法添加新迁移或使数据库保持最新或将架构迁移到先前状态的问题:
- 我将合并项目中的命名空间更改为所有迁移,并将配置本身更改为新的命名空间值。
-
我对数据库执行了以下语句:
USE [DatabaseName] GO UPDATE [dbo].[__MigrationHistory] SET [ContextKey] = N'NewNamepacePlusConfigurationClassName' WHERE ContextKey= N'NamepacePlusConfigurationClassName' GO
-
我使用配置构建包含迁移的项目
现在一切都按预期工作,我什至可以使用语句向后更改模式
Update-Database -TargetMigration PreviousMigration