昨天我绝对确定EF的所有迁移数据都放在了类中,放在我的解决方案中,嵌套在DbMigration中。但今天我稍微挖了一点(只是尝试回退到旧的迁移,不使用nu-get和visual studio,而是使用代码())启用数据丢失
DbMigrator fg = new DbMigrator(new Settings() { AutomaticDataLossEnabled = true});
fg.Update("MigrationName");
并获得异常,像“字符串应该被截断”那样,这意味着迁移器尝试从大到小的MaxLength属性更新列。因此,我排除了导致此更新的迁移并将此更改移至迁移,这些创建表。错误仍然发生。我得到了intellitrace,它说那些(删除的)迁移仍然被调用。期待请求告诉我这样的事情:
SELECT [Extent1].[MigrationId] AS [MigrationId] FROM [dbo].[__MigrationHistory] AS [Extent1]
查看表__MigrationsHistory并使用包含加密数据的字段 model 获取已删除的迁移(暂不解密)。我真的很震惊。这是否意味着在类中编写的所有代码只是假冒且真正执行的代码放在这里?有谁知道,如何使用这个表,将迁移类的预测注册到它等等。或者曾经使用迁移的方法是nu-get console?
答案 0 :(得分:1)
我不完全确定您的主要问题是什么,因此我将首先尝试回答关于__MigrationHistory
表格的最后一部分。
类中的代码不是假的,您的代码在类中被编译和运行。
但是,此表确实包含您的数据库模型,但它未加密,而是压缩的。迁移API需要存储模型的原因是能够将其与您当前的实际模型进行比较并跟踪更改(例如,当您添加新属性时,它将能够告诉您添加和执行的属性自动数据库迁移)。
在EF的早期版本中,存在一个EdmMetadata表,其中存储了模型的哈希值,并且EF能够通过比较存储的和当前的模型哈希值来检测您是否对模型进行了一些更改。启用迁移时的新版本将整个模型存储为压缩blob,因此它可以在用于创建数据库的模型和您正在使用的当前模型之间执行 diff ,并相应地进行自动迁移。
您不应直接使用此表,它会由迁移API自动填充,但nuget控制台不是进行迁移的唯一方法,您可以查看this资源以获取有关如何通过代码执行此操作的一些见解
现在,关于问题标题中的问题(存储它们的位置?),迁移存储在代码中,在继承自DbMigration
类的类中,当您执行Add-Migration命令时迁移API为您创建的类nuget控制台。当您从nuget包管理器控制台或代码执行迁移(Update-Database)时,API会将您当前的模型与__MigrationsHistory
中的版本进行比较,以查找初始版本(如果您尚未指定)并执行所有操作初始版本和目标版本之间的迁移(如果未指定,则目标是最新版本)。
我不清楚你是如何排除导致问题的迁移的,因为你需要在迁移之前将数据库迁移到版本,然后从那里删除并重新创建所有后续迁移。
也许您可以通过在迁移中实施public override void Down()
方法来解决旧版本问题,这会导致尝试回滚时出现问题?此方法可用于执行执行逆任何迁移操作的代码。
与问题没有直接关系,但值得一提的是,EF CF还有非常详细的教程here。