我正在使用带有Model First方法的Entity Framework 4。
我开始了该项目,设计了实体并生成了数据库。一切正常。
然后,我需要回去向模型添加另一个实体。但是,当我将实体拖到EDMX时,出现以下错误:
好的!我只需要将Entity1映射到表即可。我正在使用“模型优先”方法,我希望它在生成DDL时为我创建表。
如何解决此错误?
我正在使用带有Model First方法的Entity Framework 4。
我开始了该项目,设计了实体并生成了数据库。一切正常。
然后,我需要回去向模型添加另一个实体。但是,当我将实体拖到EDMX时,出现以下错误:
好的!我只需要将Entity1映射到表即可。我正在使用“模型优先”方法,我希望它在生成DDL时为我创建表。
如何解决此错误?
Answers:
这是因为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中删除表时也会出现此错误。这是因为实体框架不会自动为您删除实体。手动删除实体,错误将消失。
我发现我遇到了同样的错误,因为在两个实体之间创建关联后忘记创建引用约束。
错误3027:未为以下EntitySet / AssociationSet指定映射...”-实体框架问题
如果使用Entities Framework开发模型,则有时可能会遇到此烦人的错误:
错误3027:未为以下EntitySet / AssociationSet [实体或关联名称]指定映射
当在EDM上一切正常时,这可能没有任何意义,但这是因为此错误通常与EDM无关。它应该说的是“重新生成数据库文件”。
您会看到,实体在构建期间会对照SSDL和MSL进行检查,因此,如果您只是更改了EDM但未使用“ 生成数据库模型...”,那么它会抱怨sql脚本中缺少某些内容。
因此,简而言之,解决方案是:“ 如果您要进行模型优先开发,请不要忘记 在更新EDM之后每次生成数据库模型。希望您的问题得到解决”。
我进行了表更改,并通过edmx模型浏览器确认,它创建了另一个结尾为1的实体(例如MyEntity1
和MyEntity
)。关于这两个实体的某些信息使处理变得混乱。
删除表并重新添加以修复它。
请注意,如果挂接了TFS,则在删除后对edmx进行检入。然后,只有这样,才能获得最新信息,并通过确定的两步过程将其重新添加。否则,TFS会与相同名称实体的删除和重新添加混淆,这似乎会引起问题。
对于那些正在使用Database First
方法的人,在插入新实体后,您要做的就是Generate Database From Model
再次右键单击.edmx
文件并选择Generate Database From Model...
Search within file content
和Search External Files
删除所有引用缺少实体的代码行。它们将如下所示:
public virtual DbSet< Entity1> Entity1 { get; set; }
从数据库删除的表常见此错误。
当一个人在数据库中删除一个表,或者只是更改web.config.connectionStrings
EF Mapped数据库的表时,要指向一个新表,而不是用于生成原始映射的表。
就是这个新的数据库,这些不存在3027错误的实体。
来自数据库的更新模型不适用于我。
我必须删除冲突的实体,然后从数据库执行更新模型,最后重新构建解决方案。之后,一切正常。