gpt4 book ai didi

.net - Entity Framework 代码优先 : How to manually update the database?

转载 作者:行者123 更新时间:2023-12-03 11:22:46 27 4
gpt4 key购买 nike

我已经构建了一个小 WPF 演示应用程序,它使用 EF Code-First 将其数据保存在 SQL CE 4.0 DB 中。除非我从模型对象中删除属性,否则它工作正常。例如,如果我从这个类中删除“HosteBy”.....

public class Dinner
{
public int DinnerID { get; set; }
public string Title { get; set; }
public DateTime EventDate { get; set; }
public string Address { get; set; }
public string HostedBy { get; set; }

public virtual ICollection<RSVP> RSVPs { get; set; }
}

...它抛出这个异常:

The model backing the 'NerdDinners' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.



即使从数据库中手动删除字段“HosteBy”后,该错误仍然存​​在。我在这里缺少什么?我必须删除/截断数据库还是有其他解决方案?

最佳答案

在您更改 Code First 模型的第一个场景中,在您手动修改数据库之前,答案是打开 (Nuget) 包管理器控制台并键入:

update-database -verbose
除了 - 因为在这种情况下您正在删除一个列,这将报告它即将删除某些内容,并且在您明确表示可以的情况下它不会删除任何内容。所以你输入:
update-database -f -verbose
现在这将删除您在模型中的列。 -verbose说要向您展示它运行的 SQL。如果您害怕让它删除内容,而是在运行之前检查 SQL,请使用:
更新数据库 -f -script
这会将 SQL 转储到您可以查看的脚本中,然后自己手动运行。
在您继续手动删除数据库中的列的情况下,您现在手头有一个更复杂的场景;此处另一个答案中描述的 EdmMetadata 表包含整个数据库的散列,该散列现在与数据库本身不匹配。您可以通过检查您之前拥有的内容以及您的数据库当前的样子,运行手动 SQL 以将 DB 返回到 Entity Framework 期望的方式(在您手动修改它之前的方式,这使其恢复与哈希一致)。
如果这不可行,那么您现在处于 Entity Framework Code First 中最丑陋的部分。您需要消除哈希表并将数据库反向工程为代码文件。
哈希表名称取决于 EF 的版本。在您询问的较旧的 EF4 中,它称为 EdmMetadata。在较新的 EF5 中,它称为 __MigrationHistory(如果您在 SQL Server Management Studio 中查看,则在数据库中的系统表下)。你需要把它擦掉。
第二步的好消息是,将数据库逆向工程为代码,微软已经发布了一个测试版工具,可以为你做这件事。
Walk-through of reverse-engineering a db, and EF Power Tools
您可以跳过其中的许多第一步,因为他们只是在设置数据库并向其添加一些废话,以便他们可以演示您需要做什么:对数据库进行逆向工程。
更新:
使用手动迁移来解决这种情况也是可行的。备份数据库,然后运行:
add-migration WhateverYouWantToCallThis
对需要运行的 db EF Migrations 的修改将出现在生成的 C# 命令中。现在由您来修补它们以解决它正在尝试执行的操作的问题(例如尝试删除已删除的列),并放置它需要前进的东西(例如添加回来您的模型中仍有一个表,但您在数据库中手动删除了该表)。
一旦你添加了这个并运行 update-database -f , EF Code First 只会相信你已经按照它需要的方式更新了数据库,并根据最终结果更新它的哈希。如果您进行了正确的更改,您现在可以照常进行迁移。如果这仍然导致错误,您通常可以将手动迁移的命令复制到某处并将其删除,从备份中恢复数据库,再次添加手动迁移并重试。最坏的情况是您求助于上面的逆向工程步骤。

关于.net - Entity Framework 代码优先 : How to manually update the database?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6618587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com