为什么我收到此错误:没有为以下EntitySet / AssociationSet指定映射 - Entity1?

时间:2011-04-14 17:47:30

标签: .net entity-framework entity-framework-4

我正在使用Entity Framework 4和Model First方法。

我启动了项目,设计了实体并生成了数据库。一切都很好。

然后我需要回去为我的模型添加另一个实体。但是,当我将实体拖到EDMX时,我收到此错误:

enter image description here

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

如何解决此错误?

16 个答案:

答案 0 :(得分:140)

这是因为EF4以模型优先的方式工作。

当您第一次创建模型优先模型时,它处于SSDL不存在的状态。您可以拖动实体,关联它们等等,但是,如果您查看EDMX文件中的SSDL,您将看到没有任何实体在SSDL中具有关联的存储表。

单击Generate Database From Model上下文菜单项时会发生更改。令人困惑的部分是,此操作不仅仅是生成DDL脚本。实际上,它会更改EDMX文件以包含SSDL信息。从此时起,EDMX文件将进入一种状态,其中designer / CSDL中的每个实体都必须映射到SSDL中的实体。如果没有映射,则会触发编译时错误:

  

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

另一个有趣的事实是,不是那种会阻止编译的错误。它确实会生成输出类库。它不应该是一个警告或什么?

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

修改

如果您不使用模型优先并且“从数据库更新”,则在删除数据库服务器中的表的情况下也会出现此错误。这是因为Entity Framework不会自动为您删除实体。手动删除实体,错误就会消失。

答案 1 :(得分:35)

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

答案 2 :(得分:20)

  

错误3027:没有为以下EntitySet / AssociationSet指定映射..." - 实体框架令人头疼

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

  

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

当EDM上的一切看起来都很好时,这可能没有意义,但这是因为这个错误通常与EDM无关。应该说的是"重新生成数据库文件"。

你看,实体在构建期间检查SSDL和MSL,所以如果你刚刚改变了你的EDM但没有使用生成数据库模型...... 那么就会抱怨那里有#39 ; sql脚本中缺少的东西。

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

答案 3 :(得分:7)

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

答案 4 :(得分:5)

我遇到了同样的错误,但我没有使用模型优先。事实证明,我的EDMX文件不知何故包含对表的引用,即使它没有出现在设计器中。有趣的是,当我在Visual Studio(2013)中对表名进行文本搜索时,找不到该表。

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

答案 5 :(得分:4)

我进行了表格更改,并且在edmx模型浏览器确认的情况下,它创建了另一个最后带有数字1的实体(例如MyEntity1MyEntity)。关于这两个实体的一些东西混淆了处理。

移除桌子并重新添加它固定它。

请注意,如果连接了TFS,则在删除后执行edmx的签入。然后,只有这样才能得到最新的,并在一个明确的两步过程中重新添加它。否则,TFS会与删除和重新添加相同的命名实体相混淆,这些实体似乎会导致问题。

答案 6 :(得分:3)

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

答案 7 :(得分:1)

对于那些使用Database First方法的用户,只需右键点击Generate Database From Model文件,然后再选择.edmx,在插入新实体之后,您需要再次向Generate Database From Model...进行操作

答案 8 :(得分:0)

  1. 转到解决方案资源管理器,单击“搜索”按钮
  2. 选中Search within file contentSearch External Files
  3. 键入映射无法识别的实体名称。
  4. 删除与问题相关的所有文件。 那些可能会以相同的缺失实体命名。请勿删除文件中包含Context类名的任何文件,特别是如果它们的扩展名为.cs或.tt。在Context .cs文件中
  5. 删除引用缺失实体的所有代码行。它们看起来像这样:

    public virtual DbSet< Entity1> Entity1 { get; set; }
    
  6. 此错误对于从数据库中删除的表是常见的。

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

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

答案 9 :(得分:0)

当我从数据库中删除表时出现此错误。通过右键单击EDMX图解决方案,转到“属性”,从“属性”窗口的列表中选择表,然后从图中删除它(使用删除键)。

答案 10 :(得分:0)

当我尝试为存储过程创建自定义结果并假设它必须是实体时,我遇到了错误。

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

我会在这里添加它,因为看起来这个问题是谷歌在你收到此错误时带你的地方。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

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

答案 15 :(得分:0)

如果您不使用模型优先;双击“ edmx”文件->选择所有并删除所有实体模型->保存->右键单击“从数据库更新模型->选择所需表->完成并保存。