实体框架4在添加新实体标量时映射片段错误

我有一个实体框架4模型第一的设计。我在设计师那里创建了我的模型的初稿,一切都很好。我编译,生成数据库等。

后来,我尝试将一个字符串标量(Nullable = true)添加到我现有的一个实体中,并且在编译时不断得到这种类型的错误:

错误3004: 映射中的问题 从第569行开始的片段: 没有 为属性指定的映射 集合中的 MyEntity.MyValue 具有密钥的实体(PK)将不会 返回当: Entity 为 type 时 [ MyEntity. MyEntity ]

每次添加标量时,我都必须手动打开 EDMX 文件并更正 XML。

有什么想法吗?

63801 次浏览

后来发现,在我的实体上添加/更改/删除属性之后,我必须在编译之前“从模型生成数据库”,否则我会得到3004映射错误。

如果所有的查询都是在存储过程中编写的,并且您只是试图填充模型,那么您可以切换到一个适合我的复杂类型。

如何创建复杂类型:

  1. 手动更改 您是实体生成类 对某个名字有意见 已经在 edmx 文件中使用。
  2. 选择“模型浏览器”窗口,然后 右键单击/添加一个新的复杂类型。
  3. 属性的属性复制/粘贴 从原来的模型到复杂的类型。
  4. 将存储过程映射到 复杂型。

    我希望这能帮到别人。

我只是从模型中删除了不合适的表,然后将它们添加回来,一切都很好。

对于那些从数据库创建模型的人来说,我在更改数据库之后遇到了这个问题。当我由于这样或那样的原因在数据库中更改字段名时,就会发生这种情况(我认为如果更改数据类型,也会发生这种情况)。

对我来说,解决方案是右键单击工作区并选择“ Update Model from Database”。这应该添加属性从数据库到您的模型,但是,它不删除您的旧属性,这些将给你3004错误。

右键单击工作区并选择“验证”。这应该会给出一个错误列表,显示违规属性。然后可以右键单击每个违规属性,并从模型中手动删除它。

这对我来说解决了问题。希望对别人有帮助。

在对我的一个实体上的一个属性重命名后,我收到了同样的问题。

我发现没有设置实体的属性和表中相应列之间的映射。

您可以使用编辑器通过右键单击模型中的实体并选择“表映射”来设置它。确保将属性映射到数据库中的列。

编辑: 我还需要重新运行 tt 文件来生成新的类。(可能是因为我在另一个项目中有它?)

在检查了 xml 文件(edmx)之后,将模型移动到另一个项目,并意识到一切正常,我决定关闭并打开 Visual Studio 并重新编译,然后错误消失。

如果你想修改你的数据库而不重新生成整个模型或者从模型中重新创建数据库,我发现通过 Visual Studio 修改 EDMX 图中的属性,然后手动调整 Visual Studio 不允许访问的映射是最简单和最安全的。

这个错误会给你一个行号:

映射从 569行开始的片段时出现的问题

只要在文本编辑器中打开 edmx 文件,转到那一行,就会发现需要修复的地方非常明显。有一部分是这样的:

<EntityTypeMapping TypeName="YourModel.YourType">
<MappingFragment StoreEntitySet="YourType">
<ScalarProperty Name="PropertyName1" ColumnName="DatabaseColumn1" />
<ScalarProperty Name="PropertyName2" ColumnName="DatabaseColumn2" />
...
</MappingFragment>
</EntityTypeMapping>

只需确保为您需要的每个属性/列名都有一个节点,并且所有属性都在 edmx 文档顶部的 <EntityType Name="YourTable">部分中列出

另一种不需要从图表中删除表并重新添加它的方法是使用 Table Mapping 选项。

  1. 转到模型浏览器
  2. 右键单击表名。
  3. 选择表映射
  4. VisualStudio 将显示一个 EF 属性匹配/缺少表列的窗口。
  5. 选择/匹配相应的列到缺少的属性

enter image description here