概念类型中的成员数与对象端类型上的成员数不匹配

时间:2010-01-19 19:27:03

标签: entity-framework

我正在使用.net framework 3.5 SP1。

在Sql Server中向一个表添加一个列(以及将现有列从允许空值更改为不可空)后,我无法再运行我的项目而不会出现此错误:

  

中的成员数量   概念类型   'XBRLDimensionalModel.axis_t'没有   与成员数量相匹配   对象侧类型   'EOL.Xbrl.Persistence.Data.axis_t'。   确保成员数量   同样的。

我放弃了尝试查找并修复生成的代码。我现在已经删除了所有本地实体相关文件,并从头开始重新生成它们并添加一个新项目(ADO.NET实体数据模型)。我仍然得到这个错误。

我现在可以运行项目的唯一方法是撤消所有挂起的更改并使用源代码管理中的最后一个版本,当然也可以将两个已修改的数据库列更改为可为空。

到目前为止,我已经阅读过,似乎我应该能够从数据库中“更新”我的模型。这导致了这个例外(上图)。但现在我完全感到困惑,即使完全重新生成实体模型和支持类,我仍然会遇到错误。

我将edmx模型上的属性更改为:“元数据工件处理”到“复制到输出目录”。 Designer.cs,csdl,msl,ssdl文件似乎都与最新的数据库更改一致。

第一次引用entityModel实例时抛出异常。因此,它是在更改的表中加载或保存数据之前。

我出错的任何想法? 谢谢, TG

8 个答案:

答案 0 :(得分:8)

以XML格式打开您的模型。从CSDL中删除对该类型的所有引用。保存并关闭,然后在GUI中重新打开。现在您应该能够像往常一样更新模型。如果这不起作用,请执行相同的操作,但也要从MSL中删除。

答案 1 :(得分:1)

这对评论来说似乎有些冗长,所以我将其添加为另一个答案:

作为对Craig建议的回应,我在XML查看器中打开了edmx文件并删除了对Axis_t的所有引用(包括由于外键引起的关联)。从整个文件。

然后我通过打开edmx文件作为GUI界面“更新”模型,右键单击|从数据库刷新|添加(选项卡),现在只列出Axis_t表。我添加了似乎工作正常的表,并包含了我的新列,并且列已正确映射。

然后我将项目运行到相同的结果。与上面发布的错误相同。

我现在已经恢复到源代码控制中的内容以及将数据库列(新的和已修改的)更改为可为空。该项目运行良好。我仍然没能成功地在EF中实现新的DB列。它的行为就好像有一些模型的存储/编译版本没有通过“更新”过程更新。

答案 2 :(得分:1)

将外键从可空变为非可空(或反之亦然)时,请务必将关联多样性从0..1更改为1(反之亦然)。设计人员有时会在数据库的更新中忽略这一点。

答案 3 :(得分:1)

当我向db添加一列并将相应的属性添加到实体(edmx)时,我遇到了同样的问题。 我也在为我的解决方案使用源代码控制。正如我所注意到的,在保存对任何文件的更改时,使用覆盖选项保存操作提示。 所以,我覆盖了designer.cs以及配置文件,问题得到了解决。

的问候, 普山

答案 4 :(得分:0)

当我在同一个应用程序的两个版本(具有模型差异)上编译到相同的文件夹中时,发生了这种情况。

似乎Visual Studio没有正确“清理”“obj”临时文件夹,旧模型的某些片段仍在那里。

如果我只是删除“obj”文件夹中的所有文件并重新编译,则此错误就会消失。

每个版本的模型都很完美,让我发疯。

不是说这是OP问题的答案,但它确实是另一个出现此错误的原因。

史蒂夫

答案 5 :(得分:0)

我有几个小时同样的问题。发现在我的Designer.cs文件中,我的实体的一个属性缺少其属性。 (不知道这是怎么发生的?)

 [EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)]
 [DataMemberAttribute()]
 public global::System.Int32 ContractCapacity

现在错误消息有意义,这是缺少的DataMember。一旦属性被添加,IT WORKED !!!

答案 6 :(得分:0)

  • 右键单击 edmx 文件,然后使用 XML 打开。
  • 查找不正确的数据类型并进行更改。
  • 保存文件。

这对我有用。

答案 7 :(得分:0)

这是我刚刚遇到的一个噩梦场景:我有一个MVC2网站和一个单独构建的WCF服务,但共享一个配置。在这两个项目中,我使用了相同的实体容器名称;因此我为两个项目选择了相同的连接字符串。最终元数据在两者之间失去同步并导致此错误。显而易见的解决方案是在两个项目中不使用相同的实体容器名称;更改为不同的名称允许我为避免问题的每个组件指定唯一的连接字符串,从而指定元数据。

现在我明白了,很明显,但我有一两个紧张的时间!