“从数据库更新模型”看不到类型更改

时间:2011-09-15 20:04:03

标签: entity-framework entity-framework-4

我有几个列,我从Int更改为BigInt。

我打开了我的EF模型,并从数据库中做了一个更新模型'并期望看到这些列现在是Int64s。但他们仍然是Int32s。

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

我仔细检查了我的数据库,列绝对是BigInts。

所以...确实从数据库更新模型'不适用于更改数据类型?是否需要手动应用?

8 个答案:

答案 0 :(得分:42)

不幸的是,您需要从模型中删除这些项目,然后重新添加它们 - 至少这是我唯一能够实现的功能。

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

答案 1 :(得分:7)

我正在使用VS2008 SP1。如果更改edmx的“ModelView”(CSDL)中的数据类型,则会发生错误,因为“DatabaseModel”(SSDL)未更新。您必须手动编辑* .edmx(XML)。这并不像听起来那么难。您只需搜索VS提供的“错误列表”属性(在文件中搜索可能是最佳解决方案)。转到显示错误数据类型的行并修复它。

e.g。你在数据库上将float更改为nvarchar(50) - >转到您的模型并将Double更改为String - >验证 - >错误.... - >搜索酒店并进行以下更改:

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

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

如果您确切知道数据库中的更改内容,则此方法非常有效。如果您进行了无数次更改,则必须使用某些DB比较工具分析更改或重新生成整个模型。

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

小心 中号

答案 2 :(得分:4)

正确 - 数据类型似乎不会自动更新。您只需使用“属性”窗口更改模型视图中的数据类型,然后将“类型”更改为“Int64”。

答案 3 :(得分:4)

答案

对于您提到的特定方案,您需要手动将Type从Int32更改为Int64。

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

解释(来自MSDN Library

  

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

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

答案 4 :(得分:2)

您需要删除您的EF模型,然后重新创建并运行。

答案 5 :(得分:0)

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

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

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

  • 从模型中删除受影响的表,然后使用“从数据库中更新模型...”向导重新添加它们,如E.J.的回答所述。布伦南。这种方法的潜在缺点是,它不一定总能成功,特别是如果原始模型是使用Entity Framework的先前版本生成的,则有时可能迫使开发人员执行比完成该版本所需的更多工作。任务。

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我通过使用文本编辑器修改.EDMX文件来解决此问题。 找到您的值并更改其类型。然后更正错误类型,将其显示在调试器中。