在Entity Framework中更新数据库模式

8

我安装了VS SP1并尝试使用Entity Framework。

我从现有数据库创建了一个模式并尝试了一些基本操作。

大部分都很顺利,除了数据库模式更新。

我以各种基本方式更改了数据库:

  • 添加了一个新表
  • 删除了一个表
  • 向现有表添加了一个新列
  • 从现有表中删除了一列
  • 更改了现有列的类型

前三个操作进行得很好,但是类型更改和列删除没有遵循数据库更改。

是否有办法从设计师那里使其正常工作?还是目前不支持?我还没有找到相关材料,但仍在搜索。


很好的问题。最近和几年前我也遇到过这个问题。:-) 或许值得一提的是,重命名一个已存在的列可能会带来麻烦。 - mnemonic
是的,现在非常成熟了,有了CodeFirst,我不再遇到这个问题了。 - Biri
7个回答

6
我猜可能是因为这些更改会破坏现有代码的构建,但这只是我猜测。
我的逻辑如下:
首先,EF应该不仅仅是1:1表映射,因此仅仅因为您从A表中删除了一列并不意味着对于该实体,就不应该有一个属性Description。您可以将该属性映射到另一个表。
其次,更改类型可能会破坏构建。这是唯一的理由。

更改类型可能会破坏构建,但在实际应用中经常发生。RoR或Django有极低的手续摩擦来解决这个问题。为了处理“断裂”,您可以创建数据迁移。如果 EF 没有这个功能,那么就需要赶上很多东西。 - Csaba Toth

5

我发现,总的来说,“从数据库更新模型”功能仍存在许多错误。

对我来说,关键是键 - 我从未对外键关系进行的任何修改或向表添加主键并使更新程序正常工作(即它将在生成的代码上给出编译错误),但要解决问题很简单,只需删除模型并重新导入(只需要一分钟)- 显然这不是理想的解决方案,但我从未因“新鲜”导入而失败过。


1
删除并重新开始感觉很不对...但我想我不是唯一一个不得不这样做的人! - Matt Bridges

1
从我看到的设计师演示中,它并不是一个完美无缺的工具。它是一个1.0版本的产品,所以肯定会有一些痛点。更改类型似乎就是其中之一。通过观察设计师和代码生成,我发现一个人可能会在编译时(不太可能)或运行时(当模型实际执行时)出现错误。

0

我处理这个问题的方式(包括你提到的所有事情,还有重命名列)是通过对数据库进行更改并使用EF Code First重新生成EF代码。

我不会为了方便而修改EF Code First类(包括关系的无意义命名列)。

如果生产数据库中存在约束数据,则没有设计师或ORM模式生成器能够对其进行更改。这就是为什么您应该始终首先检查您对数据库的更改是否可行,尝试在开发数据库上进行更改,然后调整您的代码以反映这些更改的原因。


0

你需要自己从设计器或XML文件中删除该列。


0

如前所述,您可以从设计器中删除该列。至于更改列的数据类型:只需从数据库刷新模型,然后转到表映射并选择您在DB中更改的列。右侧的值表示您的模型,令人奇怪的是,这不会自动更新,但只需选择右侧的列,然后转到属性并更改数据类型即可。它应该变成一个下拉菜单。

干杯。

Ruddy


0

我建立了一个类似于您所请求的应用程序。但我的解决方案太过复杂。 我会尝试告诉您;

  1. 你需要创建自己的数据库管理类,这些对象将负责创建、更新数据库模式(我手动创建了它)。

  2. 我看到了ADO.NET团队博客上的好文章和源代码,你也可以从这个博客下载EDMTools,它是开源的。你还可以将模型生成和更新例程从中实现到你的项目中。

  3. 最后,当你的模式发生变化时,你应该在运行时重新创建和绑定你的模型,并重建你的数据程序集。但你必须知道最重要的事情,你应该用松散耦合的方式将你的数据模型程序集与你的项目绑定(查看这个帖子)。

    另一种方法是,你可以等待EF 4.0发布(现在是CTP 1),他们宣布将提供创建、删除、更新DatabaseScript函数。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接