为什么会出现这个错误:未为以下 EntitySet/AssociationSet - Entity1 指定映射?

111
我正在使用实体框架4和模型优先方法。
我开始项目,设计了实体并生成了数据库。一切都很顺利。
然后我需要返回并向我的模型添加另一个实体。但是,当我将实体拖到EDMX时,会出现以下错误:

enter image description here

好的!我只需要将Entity1映射到一个表中..但是!我正在使用模型优先方法,我希望在生成DDL时它为我创建表。

我该如何解决这个错误?


1
那么你能从你的模型生成数据库脚本吗? - Ladislav Mrnka
2
如果您正在使用“从数据库更新模型”,也许这篇文章会对您有所帮助。 - Junior
17个回答

158
这是因为EF4使用Model-first的方式工作。
当你首次创建一个Model-first模型时,它处于SSDL不存在的状态。你可以拖动实体,关联它们等等,但是,如果你查看EDMX文件中的SSDL,你会发现没有任何实体与SSDL中的存储表相关联。
当你点击“从模型生成数据库”上下文菜单项时,这种情况就会改变。令人困惑的是,这个操作不仅仅生成DDL脚本。事实上,它会更改EDMX文件以包括SSDL信息。从此以后,EDMX文件将进入一种状态,在这种状态下,设计器/CSDL中的每个实体都必须映射到SSDL中的实体。如果其中一个没有映射,它将触发编译时错误:

未指定以下EntitySet/AssociationSet的映射-(EntityName)

另一个有趣的事实是,这不是会阻止编译的类型的错误。它确实会生成输出类库。难道它不应该是一个警告之类的吗?
为了避免这个错误,在插入新实体后,您只需要再次点击“从模型生成数据库”即可。那样就会更新SSDL并修复映射。
编辑
如果你没有使用Model-first而是“从数据库更新”,那么如果你在DB服务器中删除了一个表,你也会出现这个错误。这是因为Entity Framework不会自动为您删除实体。手动删除实体即可使错误消失。

1
在我的模型针对 bd 的更改后,我遇到了相同的问题(这可能不是好事,因为我的方法不是以模型为先)。 - balanza
5
当您在不使用模型优先的情况下,根据数据库更新模型时,如果在服务器上删除表格,则会出现此错误,因为EF设计器不会自动删除实体。当您手动删除实体类型时,该错误将消失。 - Andre Pena
这非常有帮助。此外,如果您正在使用模型优先和“从数据库更新”并获得新表,则还会出现错误。但是运行从模型生成数据库(无需实际执行生成的脚本 - 它会破坏您的数据!)将修复代码中的映射问题,您将来使用它时不会遇到任何问题。 - Brian Warshaw
1
你会如何处理已经部署的 SQL Server CE 数据库的模式更新?如果这与现有程序完全无关,可以将其移动到单独的问题中。 - Arctic
抱歉重新激活这个问题/答案。但我在不同的情况下看到了相同的问题,并想知道是否有人可以确认这对我仍然是一个解决方案。我有一个从数据库生成的DB first模型,然后我稍微修改一些在数据库中找不到的关联。这种修改模型会产生此处列出的错误。在这种情况下,我是否仍需要执行“从模型生成DB”,但不要执行SQL脚本,以使其正常运行? - Nugs
显示剩余3条评论

37

我发现我一直犯同样的错误,因为在创建两个实体之间的关联后,我忘记了创建引用约束。


14
请查看关联属性,在底部找到“引用约束”将为空。点击省略号创建一个约束条件。 - Patrice Calvé
这对我很有帮助。我必须从我的源实体到我的导航实体创建一个1..*关系。 - duyn9uyen

24

错误3027:未为以下实体集/关联集指定映射... - Entity Framework头痛

如果你正在使用实体框架开发模型,那么有时可能会遇到这个令人烦恼的错误:

错误3027:未为以下实体集/关联集[实体或关联名称]指定映射

当EDM看起来没有问题时,这可能毫无意义,但这个错误通常与EDM无关。它应该说的是“重新生成你的数据库文件”。

你知道,Entities在构建过程中会检查SSDL和MSL,因此如果你刚刚更改了EDM但没有使用生成数据库模型...,它会抱怨你的sql脚本中缺少一些东西。

因此,简而言之,解决方案是: “每次更新你的EDM后,如果你正在进行模型优先开发,请不要忘记生成数据库模型。我希望你的问题得到了解决。”


这个方法对解决同样的错误很有效,通过生成数据库模型可以清除异常。 - kolexinfos

8

我遇到了相同的错误,但我没有使用模型优先。事实证明,我的EDMX文件包含对一个表的引用,尽管它在设计器中没有显示出来。有趣的是,当我在Visual Studio(2013)中搜索表名时,没有找到该表。

为了解决这个问题,我使用外部编辑器(Notepad++)在EDMX文件中查找有问题的表的引用,然后(小心地)删除了所有对该表的引用。很抱歉,我不知道EDMX文件最初是如何处于这种状态的。


7

在我的情况下,另一位开发者从底层数据库中删除了一些表格。当我意识到这一点并从实体中删除这些表格时,问题得到解决。这并不像听起来那么显而易见。


在我的情况下,只是从表中删除了一列,但 EF 从数据库更新时没有意识到它,因此我不得不手动从 XML 中删除该列。 - Spongebob Comrade

5
我觉得更快的方法是删除表格并重新添加它们。这样它们就可以自动映射了。 :)

5
我有一张表格更改,它创建了另一个实体并在末尾加上数字1(例如MyEntity1MyEntity),通过edmx模型浏览器确认。这两个实体的某些因素混淆了处理过程。
删除该表格并重新添加它可以解决问题。
请注意,如果连接了TFS,则在删除后对edmx进行检入。然后再进行最新版本的明确两步添加。否则,TFS会对同名实体的删除和重新添加感到困惑,这似乎会引起问题。

在表格更改后,我遇到了同样的问题。在模型下的多个位置找到了相同的实体,分别为1和2(MyEntity1,MyEntity2)。我查看了每个分支(图表、实体类型等),并删除了每个MyEntity和MyEntity[n]的实例。为了保险起见,我执行了“清理解决方案”,然后从数据库更新以仅重新添加MyEntity。 - MsTapp

2
  1. Go to Solution Explorer, click the Search button
  2. Leave checked both Search within file content and Search External Files
  3. Type the entities name which your mapping isn't recognizing.
  4. Delete all files RELATED to the problem. Those will probably be named after the same missing entity. DO NOT delete any file with your Context Class name on the file, specially if their extensions are .cs or .tt. In the Context .cs file.
  5. remove all lines of codes referencing the missing entity. They will look like this:

    public virtual DbSet< Entity1> Entity1 { get; set; }
    
这个错误通常出现在从数据库中删除表的情况下。
当我们在数据库中删除一个表,或者只是更改了EF映射数据库的web.config.connectionStrings指向新的数据库而不是用于生成原始映射的数据库时,就会出现这个问题。
问题出现在这个新的数据库上,这些实体中就没有3027错误。

2

如果您正在使用“数据库优先”方法,那么在插入新实体后,您只需要右键单击您的.edmx文件并选择从模型生成数据库...,然后再次通过Generate Database From Model生成数据库即可。


1

从数据库更新模型对我无效。

我不得不删除冲突的实体,然后执行“从数据库更新模型”,最后重新构建解决方案。之后,一切正常运作。


这对我解决了问题。谢谢你。谢谢。 - SamBerk
很高兴听到这个消息! - Willy David Jr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接