EF映射和元数据信息找不到EntityType错误
当我使用Entity Framework 4.0 RC时遇到了一个exception。 我的entity framework模型封装在一个名为Procurement.EFDataProvider的私人程序集中,而我的POCO类在另一个程序集Procurement中。Core(业务逻辑)和EFDataProvider(数据访问)之间的关系是一个名为DataProvider
所以当我尝试创build一个对象集
objectSet = ObjectContext.CreateObjectSet<TEntity>();
我收到一个错误:
无法findEntityType“Procurement.Core.Entities.OrganizationChart”的映射和元数据信息。
对于处理这个错误的其他人,我认为值得一提的是,我发现了一些导致这个(极其无用的)错误的场景:
- 拼写错误的属性(区分大小写!)
- POCO类中缺less的属性
- inputPOCO和实体types之间的不匹配(例如,int而不是long)
- 在POCO中引入(EF目前不支持枚举)
可能还有其他原因。
HTH
这可能是因为EF无法findembedded的映射信息。 在你的连接string中,你可能会有像他这样的东西:
metadata=res://*/Models.MyModels.csdl|...etc
*是一个通配符,告诉对象上下文试图findembedded的映射信息,我想扫描所有加载的程序集。 如果程序集未加载,EF将无法find它。
你需要做的是提供连接string更多关于你的映射信息embedded的信息。 将*更改为映射代码的特定程序集名称:
metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl
如果失败,find大会,并直接加载到您的ObjectContext使用:
ObjectContext.Metadataworkspace.LoadFromAssembly();
与上述不直接相关,但如果你得到这个错误信息,你已经混合了一个POCO和一个普通的模型:坏主意!
请参阅JRoppert在EF4 POCO(不使用T4)的评论:找不到EntityType的映射和元数据信息 (感谢JRoppert!)
我得到这个错误,因为我没有正确使用自定义命名空间在同一个程序集中的edmx文件。
这是关于System.Data.Objects.ObjectContext中的exception的说法
//例外:
// System.InvalidOperationException: // When the System.Data.Metadata.Edm.EntitySet from entitySetName // does not match the System.Data.Metadata.Edm.EntitySet of the object's // System.Data.EntityKey. // -or- // When the System.Data.Objects.ObjectContext.DefaultContainerName // property is not set on the System.Data.Objects.ObjectContext and // the name is not qualified as part of the entitySetName parameter. // -or- // When the specified type belongs to more than one entity set.
当连接string没有在configuration文件中指定时,我也看到了它。
另一个可能的问题是, 如果您使用的是代码优先,而您的实体types是在单独的程序集中定义的上下文定义的位置,而您没有将任何自定义映射添加到OnModelCreating(DbModelBuild modelBuilder)
方法,则EF似乎忽略数据注释。
解:
添加modelBuilder.Entity<YourEntityType>();
到OnModelCreating(DbModelBuild modelBuilder)
方法。
相关文章 。
只需检查模型的属性拼写
可能还有另一个原因。 我也拉了我的头发一晚。
我发现解决scheme中的参考文献有些混乱。 在我的项目中, edmx
属于一个名为DataAccess.Dll
的项目。 但我没有从我的exe文件中提到它。 从我的EXE我有一个名为Business.Dll
另一个项目的引用,这个项目有一个DataAccess.DLL
旧位置的引用。
进行以下testing,看看是否有这样的问题:
- 打开你的exe项目的bin导演,并保持可见。
- build立解决scheme。
- 第一个将要构build的项目是数据访问项目,您可以在bin文件夹中看到当前时间为修改date。
- 在构build其他项目的同时,您将看到DataAccess项目的修改date已更改为旧的date。
你需要检查你的引用,并确保它们引用你的dll的更新位置。
一个noob错误,但我有错误,当我的访问数据库是一个只读的用户名和密码。 希望我的错误能帮助别人。
我有一个类似的问题。 我已经有一个使用POCO类的数据库和一个我自己编写的Context对象的EDMX文件。 当我为另一个数据库添加第二个EDMX时,我使用了POCO T4模板,然后EDMX都没有工作,抛出了你提到的错误。 为了解决它,我放弃了我的自定义POCO和上下文,只使用了T4模板,所有工作都很好。
我有一个问题,我已经添加了一些列的表。
在表映射中,我重命名了列名。
尽pipe我已经运行了“Transform All Templates”并重build了应用程序,但我还是得到了“<>的相关元数据types包含以下未知属性或字段<>'的错误。
Domain.Poco.tt中这个表的类是正确的,但是我发现Domain.Poco.MetaData.tt中的相应的class.Metadata.cs文件没有更新,并且新的列有原来的名字 – 不是新的我在表格映射中指定的那些。
解? 我刚刚删除了违规的元数据类,并重新运行了“Transform All Templates”,并且正确地重新创build了正确的列/函数名称。
在我的情况下,这是同样的问题,映射不完全是预期的。 发生在我身上的是我从一个子类到基类中的一个“Table Per Hierarchy inheritance”属性,忘记了更新模型。
我有自定义的POCO,通过将edmx文件复制到一个空白的新项目,让它自动生成的实体,然后将它们与我帮助我找出差异。
我的问题是我编辑了T4模板来排除名为“msrepl_tran_version”的复制字段。 这导致数据库不匹配可能导致此错误消息的生成的类。 只要确保你的数据库和类匹配。