Entity framework 4 使用EF进行迁移。它们存放在哪里?

Entity framework 4 使用EF进行迁移。它们存放在哪里?,entity-framework-4,migration,Entity Framework 4,Migration,昨天,我确信EF的所有迁移数据都放在类中,作为从DbMigration嵌套的数据放在我的解决方案中。但今天我的挖掘稍微深入了一点(只是试着退回到旧的迁移,并不是使用nu-get和visual studio,而是使用code()启用数据丢失) 和get exception,类似smth的“字符串应该被截断”,这意味着migrator试图将列从大的MaxLength属性更新为小的MaxLength属性。所以,我排除了导致这次更新的迁移,并将这些更改移动到迁移中,这些迁移创建了表。错误仍然发生。我访问

昨天,我确信EF的所有迁移数据都放在类中,作为从DbMigration嵌套的数据放在我的解决方案中。但今天我的挖掘稍微深入了一点(只是试着退回到旧的迁移,并不是使用nu-get和visual studio,而是使用code()启用数据丢失)

和get exception,类似smth的“字符串应该被截断”,这意味着migrator试图将列从大的MaxLength属性更新为小的MaxLength属性。所以,我排除了导致这次更新的迁移,并将这些更改移动到迁移中,这些迁移创建了表。错误仍然发生。我访问了intellitrace,它说那些(删除的)迁移仍然被调用。通过查看请求,我了解到如下情况:

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

查看表uu MigrationsHistory,并使用包含加密数据的字段模型在那里获取我已删除的迁移(暂时不要解密)。我真的很震惊。这是否意味着所有在类中编写的代码都只是放在这里的伪代码和真正执行的代码?有人知道如何使用此表、向其注册迁移类的投影等吗?或者使用迁移的唯一方法是nu get console?

我不完全确定您的主要问题是什么,因此我将首先尝试回答关于
\u MigrationHistory
表的最后一部分

类中的代码是而不是伪代码,类中的代码将被编译并运行

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

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

您不应该直接使用此表,它是由migrations API自动填充的,但nuget console不是执行迁移的唯一方法,您可以查看资源以了解如何从代码执行迁移

现在,关于问题标题中的问题(它们存储在哪里?),迁移存储在代码中,该类继承自迁移API在nuget console中添加迁移命令时为您创建的
DbMigration
类。当您从nuget package manager控制台或代码执行迁移(更新数据库)时,API会将当前模型与
\uu MigrationsHistory
中的版本进行比较,以查找初始版本(如果尚未指定),并在初始版本和目标版本之间执行所有迁移(如果未另行指定,则目标为最新版本)

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

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


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

在调试类似问题时,也要记住,数据库架构的指纹存储在连接到迁移文件的资源文件中。指纹被复制到数据库中的_迁移表中。如果您查看在VisualStudio中的resx(资源)文件中,您可能看不到二进制文件;为此,请将resx文件作为text.FWIW打开。
SELECT [Extent1].[MigrationId] AS [MigrationId] FROM [dbo].[__MigrationHistory] AS [Extent1]