添加新的实体标量时,entity framework4映射片段错误
我有一个entity framework4模型优先的devise。 我在devise师中创build了我的模型的初稿,一切都很好。 我编译,生成数据库等
后来我试图给我现有的一个实体添加一个string标量(Nullable = true),当我编译时,我总是收到这种types的错误:
错误3004:从第569行开始映射片段时出现问题:没有为属性MyEntity.MyValue在Set MyEntities中指定映射。 具有密钥(PK)的实体在下列情况下不会往返:实体types为[MyEntities.MyEntity]
我一直不得不手动打开EDMX文件,并纠正XML添加标量。
想法是怎么回事?
自从发现我添加/更改/删除我的实体属性后,我必须“从模型生成数据库”编译之前,否则我得到3004映射错误。
我只是从模型中删除了违规的表格,然后将它们添加回来,一切都很好。
对于那些从数据库创build模型的人,在对数据库进行更改之后,我遇到了这个问题。 发生这种情况时,我改变了数据库中的字段名称由于某种原因(我想这也发生如果你改变数据types)。
对我来说,解决scheme是右键单击工作区并select“从数据库更新模型”。 这应该添加从数据库到你的模型的属性,但是,它不会删除您的旧属性,那些会给你3004错误。
右键单击工作区并select“validation”。 这应该会给你一个错误列表,显示违规的属性。 然后,您可以右键单击每个违规的属性,并从模型中手动删除它。
这为我解决了这个问题。 希望它可以帮助别人。
如果要修改数据库而不重新生成整个模型或从模型中重新创build数据库,我发现通过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">
部分
如果你所有的查询都是用存储过程编写的,而你只是想填充模型,那么你可以切换到一个复杂的types,这对我来说很有用。
如何创build一个复杂的types:
- 手动将您遇到问题的实体生成类的名称更改为您的edmx文件中尚未使用的名称。
- select“模型浏览器”窗口,然后右键单击/添加新的复杂types。
- 将原始模型的属性复制/粘贴到复杂types。
-
将存储过程映射到复杂types。
我希望这可以帮助别人。
重命名我的一个实体的属性后,我收到了同样的问题。
我发现我的实体的属性和表中相应的列之间的映射没有设置。
您可以通过右键单击模型中的实体并select“表格映射”来使用编辑器进行设置。 确保属性映射到数据库中的列。
编辑:我也需要重新运行我的tt文件来生成新的类。 (自从我在另一个项目中使用它可能会有?)
在检查了xml文件(edmx)之后,将模型移动到另一个项目并意识到一切正常,我决定closures并打开Visual Studio并complile againt,然后错误消失。
另一种替代方法是在不从表格中删除表格并重新添加表格的情况下,使用表格映射选项。
- 转到模型浏览器
- 右键点击表名。
- selecttablle映射
- Visual Studio将显示一个EF属性匹配/缺less表列的窗口。
- select/匹配适当的列丢失属性