在代码优先实体框架中手动编辑数据库

Posted

技术标签:

【中文标题】在代码优先实体框架中手动编辑数据库【英文标题】:Manually editing database in code first entity framework 【发布时间】:2011-08-28 07:03:16 【问题描述】:

我一直在尝试使用 MVC 3 的 EF 4.1(代码优先)。我正在考虑应用程序何时需要更改。我测试了几个场景。我喜欢在模型(我的 POCO)发生变化时手动编辑数据库的想法。

更改模型时出现 ASP.NET 错误:

“支持 'CTCMContext' 上下文的模型自数据库创建以来已更改。手动删除/更新数据库...”

现在,它说我可以“手动更新数据库”,但我做到了,但仍然遇到同样的错误。我错过了什么!?!

编辑

这和EF生成的模型哈希有关系吗?

【问题讨论】:

【参考方案1】:

我也遇到过一些困难。我发现当您让 EF 为您创建数据库时,会创建一个名为 dbo.EdmMetadata 的表,这就是 EF 跟踪模型状态的位置/方式。我发现,如果您在最初创建数据库后删除此表,您会将内容置于“手动模式”,您现在可以从数据库中手动添加/删除列、表等,并且 EF 不会抛出您的错误正在看。

但是,如果您希望在更改模型时继续让 EF 更新您的数据库,则需要创建并调用一个继承自 DropCreateDatabaseIfModelChanges 或 DropCreateDatabaseAlways 的 ContextInitializer 类,具体取决于您想要的行为发生了。

【讨论】:

感谢您的破解。对于您回复的第二部分,您可能对此感兴趣:***.com/questions/4031431/… 我正在阅读它,我可能会尝试一下。【参考方案2】:

正如我所见,EF 中实际上并没有任何用于代码优先数据演化的内置方法。

对于我最初的问题,答案在于删除模式生成/验证。只有这样才能手动编辑代码和数据库。

更新: EF 5.0 现在支持migrations

【讨论】:

【参考方案3】:

使用新的字段名更改类,删除表“EdmMetaData”,然后重新编译您的应用程序。

您将负责修改视图中的字段名称。

它对我有用。

【讨论】:

我想我可以这样做,但我必须修改数据库和元数据表......我的答案只涉及修改数据库(删除元数据表后)......跨度> 【参考方案4】:

我知道这已被标记为已解决,但就我而言,它并没有起到作用。

一旦我删除了dbo.EdmMetadata,我得到了一个不同的错误:

Model compatibility cannot be checked because the database does not contain model metadata. Ensure that IncludeMetadataConvention has been added to the DbModelBuilder conventions.

对我有用的方法是从Application_Start 中删除Initializer 类:

void Application_Start(object sender, EventArgs e)

    // MyDB.SetInitializer<MyContext>(new MyInitializer());

【讨论】:

以上是关于在代码优先实体框架中手动编辑数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架映射数据库的方法?

实体框架 6 代码优先触发器

实体框架 4.1 代码优先映射到将主键作为外键列的表

更新映射到视图的实体框架实体

无法在 .NET 中的实体框架代码优先方法中迁移 AspNetUser 实体

实体框架和代码优先开发