在向数据库表添加列之后,Entity Framework 出现问题

3
我需要在我的数据库中的一个表中添加一个新的NVARCHAR列。我添加了该列,然后启动Visual Studio更新Entity Framework的EDMX文件。
我对所有内容运行了“从数据库更新模型”,但只导致“数据读取器不兼容”错误。因此,我将整个表在数据库中重命名,从数据库更新EDMX,将表重新命名为原始名称,再次运行更新,然后为所有受影响的存储过程创建新的函数导入。但我仍然得到相同的错误:
数据读取器与指定的“[Model] . [Entity]”不兼容。“[Column]”类型的成员在数据读取器中没有具有相同名称的对应列。
我查看了一下,如果数据库和框架中的列名不同,则似乎这是常见的错误。然而,这并非如此,它们具有相同的名称。
我可以通过[Entity] .Context。[Column]在代码中访问该列,因此我不太明白数据读取器在抱怨什么。
我已经想尽了办法,所以欢迎任何帮助。

你是否将这个表用作存储过程的临时表? - Shiraz Bhaiji
1
不,实际上它是整个数据库中使用最频繁的表。 - Marcus L
当您运行存储过程或直接针对表运行linq语句时,是否会出现此错误? - Shiraz Bhaiji
从返回实体的所有存储过程中。我还没有尝试通过linq直接访问任何数据,但我的猜测是这不会成为问题,因为智能感知会识别它。 - Marcus L
我从Web.Config中的<ConnectionStrings>中删除了DBNameEntities,然后删除了.emdx并重新添加...到目前为止,这个方法已经奏效了(不幸的是,每次修改数据库时似乎都要这样做约一半的时间...)。 - Danimal111
6个回答

2

更新模型会替换存储架构,但不会替换客户端架构或映射。为了“从零开始”,备份当前的EDMX,然后将其以XML格式打开。删除所有对该表的引用,然后关闭并在图形界面中重新打开。进行构建。如果出现任何错误(可能是已删除表的损坏链接),请修复它们。然后更新模型以重新添加表。


哎呀,那个文件就像是一个地雷区!而且,这个表在所有其他表中都有外键,这是否意味着我也必须删除所有这些表?我必须说,手动编辑EDMX文件以向表添加一个简单的列简直荒谬。我并不是要批评你,Craig。这是实体框架中的一个严重缺陷。 - Marcus L
我同意EF设计器(与EF运行时不同)在3.5 SP1中有许多缺陷。但通常您不必这样做“为向表添加简单列。”更像是“当您将表添加到模型中,然后将其删除并希望重新调整设计器时。” - Craig Stuntz
有比3.5 SP1更新的版本吗? - Marcus L

1

刚遇到了与上述相同的问题。尝试从edmx中删除实体,尝试删除并重新添加函数导入,最后在函数导入中使用复杂类型进行重建,但仍然无法解决问题。

我意识到这个错误可能会发生在任何不匹配的情况下,但我们发现问题出在我们用于函数导入的存储过程中。存储过程使用特定的select列名、列名等,而我们添加到表中的新列不在该列表中。为了测试,我们使用了“*”,更新了EDMX,问题得到了解决。


+1:我遇到的问题是有太多的存储过程通过逐个命名列来选择它们,这教会了我每当你想将你的存储过程绑定到一个实体时,你必须使用 select * - Ashkan

0

对我来说,这是一个问题,我修改了一个实体(垂直实体拆分),但我的一个存储过程没有拉取该新字段的数据。我在存储过程中添加了它,现在一切都运行正常。


0

除非只是添加新项,否则每次尝试“从数据库更新模型”时,都会引发错误...

幸运的是,解决方案非常简单 -

1) Open Web.config, find <connectionStrings> node 
2) Delete the DBNameEntities <connectionStrings>  
     - this way you do not have to modify any references to your emdx model
2) Delete the ADO.NET Entity Data Model (.emdx) 
3) Re-add the ADO.NET Entity Data Model (.emdx) with the same name.

它更快,而且防弹(到目前为止!?)


0
原来 EDMX 没问题,但设计师出于某种奇怪的原因停止了更新我的项目中的 Designer.cs。
不得不手动编辑它。

这太糟糕了...我删除它并删除了DBEntities连接字符串,然后重新添加...速度更快且更可靠...(到目前为止?!) - Danimal111

0

如果您重新添加DataModel,您将失去所有的数据绑定 - 特别是表单上控件(如DbGrid)的绑定。我已经通过在外部编辑器中手动编辑DataModel.edmx文件来解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接