【问题标题】:Number of members in conceptual type does not match with number of members on object side type概念类型的成员数与对象侧类型的成员数不匹配
【发布时间】:2010-01-19 19:27:02
【问题描述】:

我正在使用 .net 框架 3.5 SP1。

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

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

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

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

从我目前所读的所有内容来看,我似乎应该能够从数据库中“更新”我的模型。这导致了这个异常(上图)。但是现在我完全感到困惑,即使完全重新生成实体模型和支持类,我仍然会收到该错误。

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

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

有什么想法我哪里出错了吗? 谢谢, TG

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    如果 EDMX 文件在 Visual Studio 外部更改,也会发生此错误。右键单击 EDMX 文件,然后单击“运行自定义工具”

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 克雷格,抱歉,您是指 CSDL 文件还是 edmx 文件,还是两者兼而有之?还有一个愚蠢的问题:要“更新模型”,我是否只需右键单击 GUI 的背景?从数据库更新模型 | (刷新标签)完成。 ?
      • 还有一个:当您说“类型”时,您是指与我的表(Axis_t)对应的实体吗?
      • CSDL 是从 EDMX 生成的。您想要编辑 EDMX 的 CSDL 部分。是的,你右键单击。是的,我的意思是类型。
      • 谜团解开了。 EF 在包含模型的程序集中生成 app.config 文件。但是,我用来测试程序集的启动项目有它自己的 EF 模型版本到同一个数据库 - 在我的数据库更改之前。实例化的 EntityModel 是我的“真实”版本,但应用程序使用的是启动项目配置文件,该文件指向旧模型中的资源工件。我刚刚删除了原始测试 EF 模型并将连接字符串复制到启动项目配置文件中。当你有一个 Sql 人在做 .net 编程时会发生这种情况:)
      • Craig,我有同样的问题(添加一些列之后),但是当我尝试删除 edmx 文件的部分 csdl 部分时,更新模型不会带回新实体。 csdl 中的实体部分确实包含新列。有什么想法吗?
      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • “从数据库更新”将完全取代 EDMX 的 SSDL 部分。当它认为它可以在不清除您所做的更改的情况下更新 CSDL 时,它也会更新。例如,如果您有一个全新的列,则应将其添加到 CSDL。另一方面,如果您更改列的类型,它可能不会更新 CSDL。如果我最初的建议对您不起作用,则可能是您错过了与该实体相关的 MSL 或 CSDL 的某些部分。
      • 一定是那么蠢。我只是用 2 个表(父/子)分别进行了一个小测试,设置了一个新模型,然后在子表中添加了一个列。然后我执行了你建议的步骤,效果很好。现在唯一的区别是真正的项目在源代码控制中,但我无法想象这会影响到这一点。我会再试一次……
      【解决方案4】:

      将外键从可空更改为不可空(反之亦然)时,请务必将关联多重性从 0..1 更改为 1(反之亦然)。设计师有时会在数据库更新中错过这一点。

      【讨论】:

        【解决方案5】:
        • 右键单击您的 edmx 文件并使用 XML 打开。
        • 找到不正确的数据类型并更改它们。
        • 保存文件。

        这对我有用。

        【讨论】:

          【解决方案6】:

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

          问候, 布山

          【讨论】:

            【解决方案7】:

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

            Visual Studio 似乎没有正确“清理”“obj”临时文件夹,并且旧模型的一些片段仍在其中。

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

            每个版本的模型都很完美,让我抓狂。

            并不是说这是对 OP 问题的答案,但它肯定是导致此错误的另一个原因。

            史蒂夫

            【讨论】:

              【解决方案8】:

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

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

              现在错误消息有意义,这是缺少的 DataMember。一旦添加了属性,它就工作了!!!

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-04-22
                  • 2018-08-10
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多