【问题标题】:The number of members in the conceptual type does not match - yet it does [duplicate]概念类型中的成员数量不匹配 - 但它确实 [重复]
【发布时间】:2018-08-10 14:05:58
【问题描述】:

我突然开始在 .NET 4 MVC 项目中遇到以下错误。

概念类型“OrnaviModel.Task”中的成员数量与对象端类型“Ornavi.Core.Objects.Task”中的成员数量不匹配。确保成员数量相同。

该项目使用 EDMX 文件,该文件用于生成所需的数据对象。该项目上周运行良好,但是现在每当我向任何实体添加新字段时都会出现此错误。删除新属性会立即修复错误。

该字段也已添加到基础数据库表中,因此不应存在不匹配。

为什么我的文件突然停止正确生成?我试过“运行自定义工具”,但无济于事。我已经在单独的PC上尝试过,没有乐趣。如果我以 XML 模式打开 EDMX 文件,我可以看到新属性就在那里,同样,如果我浏览到生成的类,属性就在那里。

请帮忙..它快把我逼疯了!

编辑:我仍然没有得到答案,所以我将发布一些屏幕截图,看看是否有帮助:

我修改了Tasks表,如下:

然后我单击“从模型生成数据库”以刷新底层对象。如果我展开 DataModel.edmx 文件并浏览到相关类,我可以看到新字段:

我也将该列添加到数据库中,但每次访问该页面时:

概念类型“OrnaviModel.Task”中的成员数量与对象端类型“Ornavi.Core.Objects.Task”中的成员数量不匹配。确保成员数量相同。

为什么会出现这种情况?

我尝试了以下方法: - 在 edmx 上运行自定义工具 - 在另一台计算机上进行更改 - 尝试了不同的表、列、变量类型

笔记本电脑上没有任何变化 - 相同版本的 Visual Studio,没有安装更新。

每次都是同样的问题。如果我删除该列,单击“从模型生成数据库”,它就可以正常工作了。重新添加,同样的问题。

请帮忙!这个项目的数据库结构非常庞大,所以我真的不想重新创建整个项目!

【问题讨论】:

  • 您使用的是哪种实体类型(POCO 或 EntityObjects)?您可能想以某种方式查看 EF 当前使用的代码生成策略(尤其是在导航属性和关联多重性中),因为您的问题清楚地表明 EF 生成了另一个具有重复名称的列属性(但前缀改为下划线)。
  • @TetsuyaYamamoto - 我添加了一张显示生成设置的新照片。它不是创建重复项 - 它是使用 getter/setter 创建公共和私有属性
  • "如果我以 XML 模式打开 EDMX 文件,我可以看到新属性在那里" 它应该在 3 个地方 - 在edmx:StorageModelsedmx:ConceptualModels 下和edmx:Mappings。从错误消息看来,其中一个(或多个)丢失了。
  • @IvanStoev - 我检查了 XML,新字段出现在所有 3 个部分中
  • 我玩了很多,我发现当我在数据类型为 bool 的实体中添加一个属性并从模型生成数据库时,我向我展示了该实体作为位数据类型。

标签: asp.net-mvc visual-studio entity-framework edmx edmx-designer


【解决方案1】:

可能是您在不同的项目中有两个版本的模型,例如此评论中提到的类似问题的解决方案:

Number of members in conceptual type does not match with number of members on object side type

【讨论】:

  • 这正是我遇到的问题!项目中有两个模型,一个正在慢慢淘汰的旧模型,代码被转移到包含新模型的 DLL 中。新列只添加在其中一个中,导致错误。
【解决方案2】:

请注意 该错误表示生成的代表您的模型的类与您的模型定义 xml 不同步。

使用以下方法之一:

  • 尝试重新生成它们(通过在 EF 中移动一些东西 设计器或右键单击 edmx 文件并选择运行自定义 工具)。
  • 以 XML 格式打开您的模型。从 CSDL。保存并关闭,然后在 GUI 中重新打开。现在你应该可以 像往常一样更新模型。如果这不起作用,做同样的事情, 但也要从 MSL 中删除。

【讨论】:

    【解决方案3】:

    据我了解你的问题,可以简单解释一下

    新列存在于数据库表中,但目前不存在 存在于数据模型类中。您必须更新模型以包含 你的新专栏。在 Models 文件夹中,打开 ContosoModel.edmx 文件 显示模型图。请注意,学生模型不 包含 MiddleName 属性。右键单击设计上的任意位置 表面,然后选择从数据库中更新模型。

    您可以在EF Database First with ASP.NET MVC: Changing the Database找到更多详细信息。

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      据我了解,您使用的是模型优先方法。

      我想分享一个我在 .NET 4 MVC 项目中遇到的历史问题 -> 我是数据库优先的方法,每当我们在 DB 表中添加新列时,我们在刷新模型时都会遇到类似的问题.

      我的感觉是,同样的错误也存在于您的模型优先方法中。

      在我们的例子中,我们确实通过完成删除 .edmx 模型然后重新生成它来解决它。 (在 DB-first 中这很容易做到)。

      但是,就您而言,我想建议一些故障排除方法 ->

      1. 尝试在您的完整解决方案中搜索一些其他已经存在的属性,例如“CreatedById”,看看它存在于多少地方。
      2. 现在搜索您的新“Test”属性并匹配它是否缺少某处。
      3. 如果您发现它在某处丢失,请尝试在该文件中手动添加它并重新编译您的解决方案。

      如果这可行,那么正如我已经说过的更新模型数据库更改有点错误。

      【讨论】:

        【解决方案5】:

        感谢@Gert 现在我明白了,因为它是模型优先的方法。

        所以我认为问题是表数据类型和实体数据类型的映射尝试将数据类型设置为数据库中的位

        如果无法从模型生成数据库,请尝试将表中测试列的数据类型设置为BIT

        【讨论】:

        • (bit bool)、(varchar string)等这些类型的转换都是自动处理的。
        【解决方案6】:

        我只是在我的电脑上更改我的日期时间。没关系。问题是:我最近从备份中恢复了数据库,然后在平板电脑中添加了一些列并使用模块。我的新恢复表中遗漏了 Etisiting 协奏曲模型列。我从备份中恢复了正确的数据库,它对我有用!

        【讨论】:

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