2008-08-15 137 views
8

我安装了VS SP1,并使用实体框架进行游戏。更新实体框架中的数据库模式

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

除了数据库模式更新,大部分情况都很好。

我在每一个基本方式更改的数据库:

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

前三个进展顺利,但类型更改和列删除未遵循数据库更改。

有没有什么办法可以让设计师的作品?或者目前不支持?我还没有找到任何相关材料,但仍在搜索。

+0

伟大的问题。最近和几年前有同样的问题。 :-)也许值得一提的是,重命名现有的列可能会导致头痛。 – mnemonic 2015-03-25 08:53:12

+0

是的,现在已经非常成熟了,codefirst我再也没有这个问题了。 – Biri 2015-03-28 09:52:29

回答

6

我猜想可能这些不会发生,因为他们会破坏现有代码的构建,但这只是我的一个猜测。

这里是我的逻辑:

首先,EF应该是超过1:1的映射表,所以它很可能只是因为你是从表A中删除列并不意味着该实体,不应该有一个属性说明。您可能只需将该属性映射到另一个表。

其次,更改类型可能会破坏构建。那是那里唯一的理由。

+0

更改类型可能会破坏构建,但在现实世界的应用程序中发生。 RoR或Django具有极低的摩擦程序。要处理“中断”,您需要创建数据迁移。如果EF没有,那么有很多事情要跟上。 – 2016-12-16 03:10:48

1

从我看过的设计师演示来看,这不是一个完美的工具。它是1.0版本的产品,所以它肯定会有一些痛点。改变类型就是其中之一。从设计师和代码生成的角度来看,我认为在编译时(不太可能)或运行时(模型实际执行时)会破坏。

0

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

5

我发现,一般来说,'从数据库更新模型'功能仍然存在相当多的错误。

键是我的杀手 - 我还没有对外键关系进行任何修改,或者将主键添加到表中并让更新程序正常工作(因为它会给出编译生成的代码错误) - 但要解决这个问题,只需删除模型并重新导入(只需要一分钟) - 这显然不太理想,但我从来没有从“新鲜” '进口。

0

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

干杯。

Ruddy

0

我建立了类似的应用程序,像你的要求。但我的解决方案很难。我会尽力告诉;

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

  2. 我在ADO.NET Team blog上看到了很好的文章和源代码,那么你也可以从这个博客下载EDMTools,它是开源的。而且您还可以实现模型生成并从其中更新例程到您的项目中。

  3. 最后,当您的模式发生变化时,您应该重新创建并绑定模型,并在运行时重建数据组合件。但是你必须知道最重要的想法,你应该将你的数据模型组件与你的项目松散耦合在一起(看看这个post

    其他方法,你应该等待EF 4.0版本(它现在是CTP 1),它们宣布他们将提供创建,删除,更新DatabaseScript功能。

好锁

0

的方式我这样做(和我做所有你提到的事,再加上重命名列)是通过更改的数据库,并使用再生EF代码EF代码第一。

我并没有篡改EF Code First类的好或坏(包括关系的无意义命名列)以简化过程。

如果设计器或ORM模式生成器限制了其中的数据,则不会对生产数据库进行更改。这就是为什么您应该始终检查您对数据库的更改是否可行,在开发数据库上尝试它们,然后调整代码以反映更改。

相关问题