我有一个实体框架4模型优先设计。我在设计师中创建了我的模型的初稿,一切都很顺利。我编译,生成数据库等。
后来我试图将一个字符串标量(Nullable = true)添加到我现有的一个实体中,并且在编译时我一直遇到这种类型的错误:
错误3004:映射问题 从第569行开始的碎片:没有 为属性指定的映射 Set MyEntities中的MyEntity.MyValue。一个 具有密钥(PK)的实体不会 往返时:实体是类型 [MyEntities.MyEntity]
每当我添加标量时,我都必须手动打开EDMX文件并更正XML。
关于发生了什么的想法?
答案 0 :(得分:76)
从那时起我发现在我的实体上添加/更改/删除属性后,我必须“在模型中生成数据库”,否则我会得到3004映射错误。
答案 1 :(得分:42)
我刚刚从模型中删除了有问题的表格,然后将它们添加回来,一切都很顺利。
答案 2 :(得分:29)
对于那些从数据库创建模型的人来说,在我对数据库进行更改后,我遇到了这个问题。当我因为某种原因更改了DB中的字段名称时发生了这种情况(我认为如果更改数据类型也会发生这种情况)。
对我来说,解决方案是右键单击工作区并选择“从数据库更新模型”。这应该将数据库中的属性添加到您的模型中,但是,它不会删除您的旧属性,这些将为您提供3004错误。
右键单击工作区并选择“验证”。这应该会给你一个错误列表,显示有问题的属性。然后,您可以右键单击每个违规属性,然后从模型中手动删除它。
这解决了我的问题。希望它可以帮助别人。
答案 3 :(得分:11)
如果要修改数据库而不重新生成整个模型或从模型重新创建数据库,我发现通过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">
部分中
答案 4 :(得分:1)
如果您的所有查询都是用存储过程编写的,而您只是想填充模型,那么您可以切换到适合我的复杂类型。
如何创建复杂类型:
将存储过程映射到 复杂的类型。
我希望这有助于某人。
答案 5 :(得分:1)
在不从图中删除表并重新添加表的情况下,另一种方法是使用表映射选项。
答案 6 :(得分:0)
在我的某个实体上重命名属性后,我收到了同样的问题。
我发现我的实体属性与表中相应列之间的映射没有设置。
您可以使用编辑器通过右键单击模型中的实体并选择“表格映射”来设置此项。确保将属性映射到数据库中的列。
编辑:我还需要重新运行我的tt文件来生成新类。 (可能自从我在另一个项目中有它?)
答案 7 :(得分:0)
在查看xml文件(edmx)之后,将模型移动到另一个项目并意识到一切正常,我决定关闭并打开Visual Studio并再次编译,然后错误消失。