【问题标题】:Update database schema in Entity Framework在实体框架中更新数据库架构
【发布时间】:2010-09-05 22:38:52
【问题描述】:

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

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

大部分进展顺利,除了数据库架构更新。

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

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

前三个进展顺利,但类型变化和列删除并没有跟随数据库变化。

有没有办法让设计师的作品?还是暂时不支持?我还没有找到任何相关材料,但仍在搜索。

【问题讨论】:

  • 好问题。最近和几年前有同样的问题。 :-) 或许值得一提的是,重命名现有列可能会让人头疼。
  • 是的,现在已经很成熟了,有了codefirst我就没有这个问题了。

标签: .net entity-framework schema


【解决方案1】:

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

这是我的逻辑:

首先,EF 应该是超过 1:1 的表映射,因此很可能仅仅因为您从表 A 中删除一列并不意味着对于该实体,不应该有属性 Description .您可能只是将该属性映射到另一个表。

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

【讨论】:

  • 更改类型可能会破坏构建,但在现实世界的应用程序中它会发生。 RoR 或 Django 对此具有极低的摩擦程序。要处理“中断”,您需要创建数据迁移。如果 EF 没有,那么还有很多事情要赶上。
【解决方案2】:

从我看到的设计师的演示来看,它不是一个完美的工具。是1.0版本的产品,难免会有一些痛点。更改类型似乎就是其中之一。通过观察设计器和代码生成,我认为一个会在编译时(不太可能)或运行时(模型实际执行时)中断。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 删除并重新开始感觉很不对劲......但我想我不是唯一一个不得不诉诸于此的人!
      【解决方案5】:

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

      干杯。

      红润

      【讨论】:

        【解决方案6】:

        我按照您的要求构建了类似的应用程序。但我的解决方案太难了。 我会试着告诉;

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

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

        3. 最后,当您的架构发生变化时,您应该重新创建和绑定您的模型,并在运行时重新构建您的数据程序集。但是你必须知道最重要的想法,你应该将你的数据模型程序集与你的项目以松散耦合的方式联系起来(看看这个post

          否则,您应该等待 EF 4.0 发布(现在是 CTP 1),他们宣布将提供创建、删除、更新 DatabaseScript 功能。

        锁好

        【讨论】:

          【解决方案7】:

          我这样做的方式(我正在做你提到的所有事情,加上重命名列)是通过更改数据库并使用 EF Code First 重新生成 EF 代码。

          我不会为了好坏而篡改 EF Code First 类(包括用于关系的无意义命名列)以简化流程。

          如果您的生产数据库中包含受约束的数据,则任何设计器或 ORM 模式生成器都无法对它进行更改。这就是为什么您应该始终首先检查您对数据库的更改是否可行,在开发数据库上尝试它们,然后调整您的代码以反映更改。

          【讨论】:

            猜你喜欢
            • 2023-03-25
            • 1970-01-01
            • 1970-01-01
            • 2011-03-10
            • 2022-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多