【问题标题】:"Update Model from Database" does not see a type change“从数据库更新模型”看不到类型更改
【发布时间】:2011-09-15 20:04:02
【问题描述】:

我有几列从 Int 更改为 BigInt。

我打开了我的 EF 模型并执行了“从数据库更新模型”并希望看到这些列现在是 Int64。但它们仍然是 Int32。

(为了确定,我跑了好几次。)

我仔细检查了我的数据库,这些列肯定是 BigInts。

那么...“从数据库更新模型”是否不适用于更改数据类型?需要手动申请吗?

【问题讨论】:

  • 我正在使用 EF6,但这种情况仍在发生。令人难以置信的是,仅有的两种解决方案是手动进行更改或重新创建模型,一点也不方便。再次证实了我对 O/R 映射器无用的怀疑。他们假装为您节省了很多时间,但后来却给您带来了很多痛苦(尤其是在性能方面)。

标签: entity-framework entity-framework-4


【解决方案1】:

不幸的是,您需要从模型中删除项目,然后将它们重新添加 - 至少这是我设法开始工作的唯一事情。

至少有一个第三方工具可以帮助解决这个问题,但还没有亲自尝试过。

【讨论】:

  • 知道第三方工具叫什么吗?我有一个相当大的模型,有很多关系。我还需要自定义我的模型(因为 EF 不支持 Schemas)。因此,删除和重新生成既费时又容易出错。
  • 这是我听说过的,但自己没试过:huagati.com/dbmltools
  • ...四年后,这仍然没有解决。
  • 这非常令人失望,像实体框架这样的高调工具不能正确地完成这个简单的任务。
  • 2017 年仍未修复。+1
【解决方案2】:

我正在使用 VS2008 SP1。如果更改 edmx 的“ModelView”(CSDL)中的数据类型,则会出现错误,因为“DatabaseModel”(SSDL)没有更新。您必须手动编辑 *.edmx (XML)。这并不像听起来那么难。

您可以简单地搜索 VS 的“错误列表”为您提供的属性(在文件中搜索可能是最好的解决方案)。转到出现错误数据类型的行并修复它。

例如您在数据库中将 float 更改为 nvarchar(50) --> 转到您的模型并将 Double 更改为 String --> validate --> Error.... --> 搜索属性并进行以下更改:

      <Property Name="YourChangedProperty" Type="float" />

      <Property Name="YourChangedProperty" Type="nvarchar" MaxLength="50" />

如果您确切地知道您对数据库所做的更改,这将非常有效。如果您进行了无数次更改,则必须使用一些 DB 比较工具分析您的更改或重新生成整个模型。

不是很好。但它“有效”。

保重 M

【讨论】:

  • 这个小技巧帮助了我。就像你说的那样,这不是最好的方法,但可以准确地完成工作。
【解决方案3】:

正确 - 数据类型似乎不会自动更新。您可以使用“属性”窗口简单地更改模型视图中的数据类型,并将类型更改为 Int64。

【讨论】:

    【解决方案4】:

    回答

    对于您提到的特定场景,您需要手动将类型从 Int32 更改为 Int64。

    有很多方法可以做到这一点,但最简单的可能就是打开模型(使用默认编辑器)并将属性的类型从 Int32 更改为 Int64。

    解释(来自MSDN Library

    ADO.NET 实体数据模型设计器(实体设计器)使用更新模型向导根据对数据库所做的更改来更新 .edmx 文件。作为此过程的一部分,更新模型向导会覆盖存储模型。更新模型向导还对概念模型和映射进行了一些更改,但仅在将对象添加到数据库时才进行这些更改。例如,当向数据库中添加表时,会将新实体类型添加到概念模型中,当向表中添加列时,会将新属性添加到实体类型中。有关对 .edmx 文件进行哪些更改的详细信息,请参阅Changes Made to an .edmx File by the Update Model Wizard

    对于您的方案,需要注意的重要一点是更新模型向导正在使用您的更改更新 .edmx 文件,但仅更新到 存储模型。当对现有列的定义进行更改时,概念模型不会更新。有关更新模型向导所做更改的完整说明,请参阅上面的“更新模型向导对 .edmx 文件所做的更改”链接。

    【讨论】:

      【解决方案5】:

      您需要删除您的 EF 模型,然后重新创建,然后才能工作。

      【讨论】:

        【解决方案6】:

        这可能是一个较老的问题,但由于问题没有改变,因此在今天它肯定仍然具有相关性。因此,我想我会提供迄今为止对这个问题进行的研究的概要,包括我自己的一些观察:

        更新现有数据类型的失败是设计使然,基于 Microsoft 文档中有关该主题的注释,正如 timb 的回答中所报告的那样。 (请注意,Microsoft 似乎已经移动或清除了链接的文档,并且当前文档并未提及此问题,但在存档文档的其他地方仍然可以找到类似措辞的注释。Reference)“从数据库更新模型... " 向导不会更新这些更改,而是将解决问题的责任推回给开发人员,以避免进行不正确的自动更改,这在理论上可能会以开发人员不希望的方式损坏模型。

        因此,实际上只有两种方法可以解决此问题,而无需借助第三方工具:

        • 从模型中删除受影响的表并使用“从数据库更新模型...”向导重新添加它们,如 E.J. 的回答中所述。布伦南。这种方法的潜在弱点是它并不总是成功,特别是如果原始模型是使用以前版本的实体框架生成的,这有时会迫使开发人员执行比完成任务。

        • 从图形模型查看器中手动调整受影响的字段,方法是右键单击表中的字段并从上下文菜单中选择“属性...”。 注意:不要直接从代码窗口手动更改 Model .cs 文件,因为下次“从数据库更新模型.. ." 向导运行;如果更改是从图形模型查看器执行的,它们将在重新运行向导后持续存在。

        【讨论】:

          【解决方案7】:

          此外,如果您在 Windows 上使用 MySQL - 重新创建模型也可能无济于事。 Schema 以某种方式缓存在 MySQL 中。因此,如果即使在重新创建后模型也没有更新,请尝试重新启动 MySQL 服务和 VS 以确保。在该模型应该成功更新之后。

          【讨论】:

            【解决方案8】:

            我通过使用文本编辑器修改 .EDMX 文件解决了这个问题。 找到你的价值并改变它的类型。然后更正将在调试器中显示的其他错误中的类型。

            【讨论】:

              猜你喜欢
              • 2021-08-20
              • 2012-01-07
              • 2017-08-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多