使用EF进行迁移.它们被存储在哪里



昨天我绝对肯定EF的所有迁移数据都放在类中,放在我的解决方案中,作为DbMigration的嵌套。但是今天我挖得更深了一点(只是试着回到旧的迁移,启用数据丢失,而不是用nu-get和visual studio,而是用code())

DbMigrator fg = new DbMigrator(new Settings() { AutomaticDataLossEnabled = true});
fg.Update("MigrationName");

并且得到异常,例如"字符串应该被截断",这意味着迁移器试图将列的MaxLength属性从大更新为小。所以,我已经排除了导致此更新的迁移,并将此更改移动到迁移,那些创建表。错误仍然发生。我去了智库,它说那些(被删除的)移民仍然被称为移民。查看请求告诉我这样的事情:

SELECT [Extent1].[MigrationId] AS [MigrationId] FROM [dbo].[__MigrationHistory] AS [Extent1]    

查找表__migrationhistory并获得我删除的迁移在那里与字段模型,其中包含加密的数据(不要解密这个)。我真的很震惊。这是否意味着在类中编写的所有代码都只是放置在这里的虚假和真正执行的代码?有没有人知道,如何使用这个表,注册迁移类的投影等。或者使用迁移的唯一方法是nu-get控制台?

我不完全确定你的主要问题是什么,所以我将首先尝试回答关于__MigrationHistory表的最后一部分。

类中的代码是而不是假的,类中的代码是编译并运行的。

这个表实际上包含您的数据库模型,但是它不是加密的,而是压缩的。Migrations API需要存储模型的原因是能够将其与当前的实际模型进行比较,并为您跟踪更改(例如,当您添加新属性时,它将能够告诉您添加了什么属性并执行自动db迁移)。

在以前版本的EF中,有一个EdmMetadata表,其中存储了模型的哈希值,EF能够通过比较存储的和当前模型的哈希值来检测是否对模型进行了一些更改。启用迁移时的新版本将整个模型存储为压缩blob,因此它可以在用于创建数据库的模型和您正在使用的当前模型之间执行diff,并相应地进行自动迁移。

您不应该直接使用这个表,它是由迁移API自动填充的,但是nuget控制台不是进行迁移的唯一方法,您可以查看这个资源,了解如何从代码中完成迁移。

现在,关于问题标题中的问题(它们存储在哪里?),迁移存储在代码中,在继承DbMigration类的类中,当您在nuget控制台执行Add-Migration命令时,迁移API为您创建了这个类。当您执行迁移(Update-Database)时,无论是从nuget包管理器控制台还是从代码,API都会将您当前的模型与__MigrationsHistory中的版本进行比较,以找到初始版本(如果您没有指定它),并在初始版本和目标版本之间执行所有迁移(如果没有指定,则目标是最新版本)。

我不太清楚你是如何排除导致问题的迁移的,因为你需要在迁移之前将数据库迁移到版本,然后从那里删除并重新创建所有后续迁移。

也许您可以通过在尝试回滚时导致问题的迁移中实现public override void Down()方法来解决回退到旧版本的问题?此方法可用于执行执行任何迁移操作的代码。

与问题没有直接关系,但值得一提的是,这里也有非常详细的EF CF教程。

最新更新