添加新实体标量时,Entity Framework 4映射片段错误


72

我有一个Entity Framework 4模型优先设计。我在设计器中创建了我的模型的初稿,一切都很好。我编译,生成数据库等。

后来我尝试向现有实体之一添加字符串标量(Nullable = true),并且在编译时不断出现此类错误:

错误3004:映射片段的问题从第569行开始:在Set MyEntities中没有为属性MyEntity.MyValue指定映射。带有密钥(PK)的实体在以下情况下不会往返:实体的类型为[MyEntities.MyEntity]

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

关于发生了什么的想法?


确切地说,您要纠正什么?
Craig Stuntz 2010年

我正在手动编辑实体类型并设置映射。
杰森·摩尔斯

Answers:


76

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


38
这是荒唐的!我是从数据库而不是从其他方式创建模型。我开始发现EF越野车很
容易

5
我注意到,当我删除属性时,模型的更新版本仍包含旧字段。我必须手动删除字段。添加此信息以防万一。
Casey Margell 2011年

我收到此错误,似乎完全好像数据库与模型不同步。但是,我正在使用代码优先,并且不能“从模型生成数据库”。我已将其设置为DropCreateDatabaseIfModelChanges,由于某种原因,它无法使用此附加属性:/
elwyn 2011年

如果您是从数据库开始的,并且不想使用VS从代码中生成数据库,而不是“生成”,请尝试“从数据库中更新模型...”
moonlightcheese 2012年

2
是的,我为什么要为EF困扰,而linq2sql从未遇到过此类问题
克里斯·巴里

43

我只是从模型中删除了有问题的表,然后将它们添加回去,一切都很好。


5
也为我工作。数据库优先。
vbullinger

这仍然在EF5中发生,这是对我有用的解决方案。就我而言,我删除了一个列,并向该表添加了外键关系(以防它帮助任何人找出原因)。数据库也是如此。
2013年

这似乎是最好的解决方案,并且容易记住。如果更改数据库,我将从现在开始删除然后再添加。
尼克

谢谢,也为我工作。从edmx文件中删除了表,从数据库更新了两次模型(一次用于删除,另一次用于刷新/添加)并且它起作用。当我已经先使用db从现有数据库生成模型,然后又在我的联结表(多对多关系)中添加了外键约束时,发生了我的事情。一旦我从edmx文件中删除了联结表,一切就恢复了正常
克里斯·龚

当我收到此错误时,我还注意到public <datatype> MyColumnName1 { get; set; }(注意1)出现在生成的模型中。
OutstandingBill

31

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

对于我来说,解决方案是右键单击工作区,然后选择“从数据库更新模型”。这应该将数据库中的属性添加到您的模型中,但是,它不会删除您的旧属性,而这些属性会给您3004错误。

右键单击工作区,然后选择“验证”。这应该给您一个显示有问题的属性的错误列表。然后,您可以右键单击每个有问题的属性,然后从模型中手动将其删除。

这为我解决了这个问题。希望它可以帮助别人。


这应该给您一个显示有问题的属性的错误列表。然后,您可以右键单击每个有问题的属性,然后从模型中手动将其删除。这个。
2015年

“右键单击工作区并选择'Validate'”,我右键单击VS从edmx文件生成的图,然后选择“ Validate”。我没有看到任何错误。我在验证错误的内容吗?
William Jockusch '16

解决了我的问题,我的出现是因为我想先做一些代码。虽然以前我在使用db forst。比失败时,我在db中添加了表并更新了模型,并出现了问题。我删除了2个字段,它起作用了(Y)
Zia Ul Rehman Mughal

1
有趣的是这个问题仍然存在。“验证”技巧对我有用-由于无法从数据库中进行更新,因此必须手动从模型中删除列。
德鲁·肯尼迪

我认为从数据库进行更新永远不会删除内容,而只会添加到您的模型中。
凯·哈特曼

12

如果您要修改数据库而不重新生成整个模型或从模型重新创建数据库,我发现通过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>

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


这是一个很好的电话-虽然如果您搞砸了可能会很危险:)
2014年

尽管确实令我惊讶的是,将一列添加到edmx的图形视图中并不能做到这一点,但这确实解决了问题!希望我能给您更多点意见……
Glenn Gordon

1

如果所有查询都是用存储过程编写的,而您只是想填充模型,则可以切换到对我有用的复杂类型。

如何创建复杂类型:

  1. 手动将您遇到问题的Entity Generated类的名称更改为edmx文件中尚未使用的名称。
  2. 选择“模型浏览器”窗口,然后右键单击/添加新的复杂类型。
  3. 将原始模型的属性复制/粘贴到复杂类型。
  4. 将您的存储过程映射到复杂类型。

    我希望这可以帮助别人。


1

在不从图表中删除表并重新添加表的情况下,另一种选择是使用表映射选项。

  1. 转到模型浏览器
  2. 右键单击表名。
  3. 选择表格映射
  4. Visual Studio将显示一个带有EF属性匹配/缺少表列的窗口。
  5. 选择/匹配适当的列以缺少属性

在此处输入图片说明


0

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

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

您可以使用编辑器进行设置,方法是右键单击模型中的实体,然后选择“表映射”。确保属性映射到数据库中的列。

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


0

复查xml文件(edmx)后,将模型移至另一个项目并意识到一切正常,我决定关闭并打开Visual Studio并再次编译,然后错误消失。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.