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

问题描述 投票:23回答:7

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

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

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

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

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

entity-framework entity-framework-4
7个回答
44
投票

不幸的是,你需要从你的模型中删除这些项目,然后重新添加它们 - 至少这是我设法完成工作的唯一方法。

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


7
投票

我正在使用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.


4
投票

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


4
投票

Answer

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

可以通过多种方式完成此操作,但最简单的方法可能就是打开模型(使用默认编辑器)并将属性类型从Int32更改为Int64。

Explanation (from MSDN Library)

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

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


2
投票

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


0
投票

这可能是一个较老的问题,但由于问题没有改变,所以今天最有效。因此,我想我会提供迄今为止在该问题上进行的研究的概要,包括我自己的一些观察:

根据有关该主题的Microsoft文档附带的说明,这种无法更新现有数据类型的设计是根据timb的回答中所述。 (请注意,Microsoft似乎已移动或清除了链接文档,当前文档未引用此问题,但类似措辞的注释仍可在存档文档的其他位置找到.Reference)“从数据库更新模型...”向导不会更新这些更改,而是将解决问题的责任推回给开发人员,以避免做出错误的自动更改,理论上可能会以开发人员不打算的方式破坏模型。

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

  • 从模型中删除受影响的表,并使用“从数据库更新模型...”向导重新添加它们,如E.J的答案中所述。布伦南。这种方法的潜在弱点在于它并不总是成功,特别是如果原始模型是使用先前版本的实体框架生成的,这有时会迫使开发人员执行比完成其他任务所需的工作更多的工作。任务。
  • 通过右键单击表格中的字段并从上下文菜单中选择“属性...”,从图形模型查看器中手动调整受影响的字段。注意:不要从代码窗口直接对Model .cs文件进行手动更改,因为下次运行“从数据库更新模型...”向导时,这些更改将被恢复;如果更改是从图形模型查看器执行的,它们将持续存在,而不是重新运行向导。

0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.