为什么会出现此错误:没有为以下EntitySet / AssociationSet-Entity1指定映射?


96

我正在使用带有Model First方法的Entity Framework 4。

我开始了该项目,设计了实体并生成了数据库。一切正常。

然后,我需要回去向模型添加另一个实体。但是,当我将实体拖到EDMX时,出现以下错误:

在此处输入图片说明

好的!我只需要将Entity1映射到表即可。我正在使用“模型优先”方法,我希望它在生成DDL时为我创建表。

如何解决此错误?


1
那么可以从您的模型生成数据库脚本吗?
Ladislav Mrnka 2011年

Answers:


147

这是因为EF4与模型优先一起使用的方式。

首次创建模型优先模型时,它处于SSDL不存在的状态。您可以拖动实体,将其关联等等,但是,如果查看EDMX文件上的SSDL,您会发现没有实体在SSDL中具有关联的存储表。

单击Generate Database From Model上下文菜单项时,情况会发生变化。令人困惑的是,此操作的作用不只是生成DDL脚本。实际上,它会更改EDMX文件以包含SSDL信息。从这一点开始,EDMX文件将进入一种状态,其中设计器/ CSDL中的每个实体都必须映射到SSDL中的一个实体。如果未映射,将触发编译时错误:

没有为以下EntitySet / AssociationSet指定映射-(EntityName)

另一个有趣的事实是,不是那种会阻止编译的错误。实际上,它将生成输出类库。这不是警告吗?

为防止出现此错误,在插入新实体之后,您要做的就是Generate Database From Model再次。这将更新SSDL并修复映射。

编辑

如果未使用“模型优先”模式,并且“从数据库更新”,则在DB Server中删除表时也会出现此错误。这是因为实体框架不会自动为您删除实体。手动删除实体,错误将消失。


1
在针对bd更改更新我的模型后,我遇到了同样的问题(这不好,因为我的方法不是模型优先的)。
balanza

5
@balanza,如果您不使用“模型优先”,而是基于数据库更新模型,则在服务器中删除表时会出现此错误,因为EF设计器不会自动删除实体。当你手动删除的实体类型,错误就会消失
安德烈·佩纳

我直接在实体数据模型的xml文件中更改了我的。我有大量的表和函数,存在一些不匹配的风险,因此我手动进行了操作。
Bat_Programmer 2015年

这超级有帮助。另外,如果您使用的是“模型优先”和“从数据库更新”并获取新表,则也会出现错误。但是,从模型运行“生成数据库”(不需要实际执行生成的脚本,它会杀死您的数据!)将解决代码中的映射问题,并且以后使用它都不会有问题。
Brian Warshaw 2015年

1
您将如何处理已部署的SQL Server CE数据库的架构更新?如果它是完全无关的过程,可以将其移到一个单独的问题上
FYK'Yak

35

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


13
仅供参考:检查关联的属性,在底部的“引用约束”将为空。单击省略号并创建约束。
PatriceCalvé2014年

这对我有帮助。我必须创建一个从原始实体到导航实体的1 .. *关系。
duyn9uyen

21

错误3027:未为以下EntitySet / AssociationSet指定映射...”-实体框架问题

如果使用Entities Framework开发模型,则有时可能会遇到此烦人的错误:

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

当在EDM上一切正常时,这可能没有任何意义,但这是因为此错误通常与EDM无关。它应该说的是“重新生成数据库文件”。

您会看到,实体在构建期间会对照SSDL和MSL进行检查,因此,如果您只是更改了EDM但未使用“ 生成数据库模型...”,那么它会抱怨sql脚本中缺少某些内容。

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


这样做可以解决相同的错误,因为“生成数据库模型”有助于清除异常
kolexinfos 2016年

7

就我而言,另一位开发人员已从基础数据库中删除了一些表。当我意识到这一点,并从实体中删除了这些表后,问题就解决了。听起来并不那么明显。


6

我遇到了同样的错误,但是我没有使用模型优先。原来,我的EDMX文件以某种方式包含了对表格的引用,即使它没有出现在设计器中。有趣的是,当我在Visual Studio(2013)中对表名进行文本搜索时,找不到该表。

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


5

我进行了表更改,并通过edmx模型浏览器确认,它创建了另一个结尾为1的实体(例如MyEntity1MyEntity)。关于这两个实体的某些信息使处理变得混乱。

删除表并重新添加以修复它。


请注意,如果挂接了TFS,则在删除后对edmx进行检入。然后,只有这样,才能获得最新信息,并通过确定的两步过程将其重新添加。否则,TFS会与相同名称实体的删除和重新添加混淆,这似乎会引起问题。


更改表后,我遇到了同样的问题。我在模型下的多个位置找到了编号为1和2(MyEntity1,MyEntity2)的相同实体。我查看了每个分支(图,实体类型等),并删除了MyEntity和MyEntity [n]的每个实例。为了达到良好的效果,我做了一个“清洁解决方案”,然后从数据库更新为仅重新添加MyEntity。
MsTapp '16

4

对我来说,一种更快的方法是删除表并重新添加它们。它自动映射它们。:)



0

从数据库中删除表时发生此错误。通过右键单击EDMX图表,转到“属性”,从“属性”窗口的列表中选择表,然后从图中删除(使用Delete键)来解决该问题。


0
  1. 转到解决方案资源管理器,单击搜索按钮
  2. 保留选中Search within file contentSearch External Files
  3. 输入您的映射无法识别的实体名称。
  4. 删除所有与问题相关的文件。这些可能将以相同的缺失实体命名。请勿删除文件上带有您的上下文类名称的任何文件,尤其是扩展名为.cs或.tt的文件。在上下文.cs文件中
  5. 删除所有引用缺少实体的代码行。它们将如下所示:

    public virtual DbSet< Entity1> Entity1 { get; set; }

从数据库删除的表常见此错误。

当一个人在数据库中删除一个表,或者只是更改web.config.connectionStringsEF Mapped数据库的表时,要指向一个新表,而不是用于生成原始映射的表。

就是这个新的数据库,这些不存在3027错误的实体。


0

当我尝试为存储过程创建自定义结果并假定它必须是一个实体时出现错误。

解决的方法是,我只是在模型浏览器中创建了一个复杂类型,并将其分配给“编辑功能导入”。

我将其添加到此处,因为看起来好像这个问题是当您收到此错误时Google将您带到哪里。


0

我已经正确设置了所有内容(基数和相关属性),但无法弄清楚为什么我继续收到错误。最终发现,EF在依赖表中自己生成了一个列(table_tablecolumn),它与表没有任何关系,因此未指定映射。我必须删除EDMX文件中的列,然后重新构建解决此问题的解决方案。我正在使用数据库方法。


0

来自数据库的更新模型不适用于我。

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


0

与他人分享。就我而言,我们正在开发一个共享的MVC解决方案,并为用于下拉菜单的表使用一个通用模块。通过添加新表更新实体模型时出现错误。事实证明,当我更新EDMX时,它可能更新了我对数据库的访问权限,这导致无法访问给我的特定表no mapping specified

只需重新添加并授予我的用户访问权限即可解决该问题。


0

我想我是在重命名并重新添加它们之前未从edmx中明确删除某些表而得到的。相反,我只是重命名了表,然后从数据库中进行了更新模型,以为它会消失,然后从模型中删除它们。然后,我从数据库做了另一个更新模型,并添加了重命名的表。

该网站正在使用新表,但是出现了错误。最终,我注意到原始表仍在模型中。我从模型中删除了它们(在edmx屏幕中单击它们,删除键),然后错误消失了。

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.