无法找到EntityType错误的EF映射和元数​​据信息

时间:2010-02-28 08:26:16

标签: entity-framework mapping entity-framework-4 metadata

使用Entity Framework 4.0 RC时遇到异常。 我的实体框架模型封装在一个私有程序集中,其名称为Procurement.EFDataProvider,我的POCO类位于另一个程序集Procurement.Core中。 Core(业务逻辑)和EFDataProvider(数据访问)之间的关系是一个名为DataProvider的工厂

所以当我尝试创建一个对象集

objectSet = ObjectContext.CreateObjectSet<TEntity>();

我收到错误:

  

无法找到EntityType'Procurement.Core.Entities.OrganizationChart'的映射和元数​​据信息。

13 个答案:

答案 0 :(得分:60)

对于其他任何处理错误的人,我认为值得一提的是我发现的一些情况导致了这个(非常无益的)错误:

  • 拼错的属性(区分大小写!)
  • POCO类中缺少的属性
  • POCO和实体类型之间的类型不匹配(例如,int而不是long)
  • POCO中的枚举(根据我的理解,EF现在不支持枚举)

也可能有其他原因。

HTH

答案 1 :(得分:12)

这可能是因为EF无法找到嵌入的映射信息。在您的连接字符串中,您可能会有类似他的内容:

metadata=res://*/Models.MyModels.csdl|...etc

*是一个通配符,告诉对象上下文尝试查找嵌入的映射信息,我认为,扫描所有已加载的程序集。如果未加载程序集,EF将无法找到它。

您需要做的是为连接字符串提供有关嵌入映射信息的位置的更多信息。将*更改为映射代码的特定程序集名称:

metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl

如果失败,找到程序集并使用以下命令将其直接加载到ObjectContext中:

ObjectContext.Metadataworkspace.LoadFromAssembly();

答案 2 :(得分:3)

与上述内容没有直接关系,但如果您收到此错误消息并且您混合了POCO和常规模型:糟糕的主意!

另请参阅JRoppert在EF4 POCO (not using T4): Mapping and metadata information could not be found for EntityType的评论(感谢JRoppert!)

答案 3 :(得分:2)

我收到了这个错误,因为我在同一个程序集中有超过edmx文件而没有正确使用自定义命名空间。

以下是关于System.Data.Objects.ObjectContext

中的异常的说法

//例外:

    //   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.

答案 4 :(得分:2)

在配置文件中未指定连接字符串时,我也看到了它。

答案 5 :(得分:2)

另一个可能的问题是,如果您使用的是代码优先,并且您的实体类型是在单独的程序集中定义到上下文定义的位置,那么您就是&#39 ; t为OnModelCreating(DbModelBuild modelBuilder)方法添加了任何自定义映射,然后EF似乎忽略了数据注释。

<强>解决方案:

modelBuilder.Entity<YourEntityType>();添加到OnModelCreating(DbModelBuild modelBuilder)方法。

Related post

答案 6 :(得分:1)

只需使用模型检查属性拼写

答案 7 :(得分:1)

可能还有另一个原因。我也把头发拉了一晚。

我发现解决方案中的参考文献存在一些混乱。在我的项目中,edmx属于名为DataAccess.Dll的项目。但我没有从我的exe中提及它。从我的exe中我引用了另一个名为Business.Dll的项目,该项目有DataAccess.DLL的引用和旧位置。

进行以下测试,看看是否有这样的问题:

  1. 打开exe项目的bin director并将其保持可见。
  2. 构建解决方案。
  3. 将构建的第一个项目是数据访问项目,您可以在bin文件夹中看到当前时间作为其修改日期。
  4. 在构建其他项目时,您将看到DataAccess项目的修改日期已更改为旧日期。
  5. 您需要检查您的参考文献并确保它们引用您的dll的更新位置。

答案 8 :(得分:1)

在我的情况下,它本质上是同一个问题,映射不完全符合预期。发生在我身上的事情是我将一个属性从“每个层次结构表继承”中移出一个子类到基类,忘了更新模型。

我有自定义POCO并将edmx文件复制到一个空白的新项目中,让它自动生成实体,然后将它们与我帮助我找到差异的内容进行比较。

答案 9 :(得分:0)

一个noob错误,但是当我访问数据库的时候有一个只读用户名和密码时,我遇到了错误。希望我的错误能帮助别人。

答案 10 :(得分:0)

我有类似的问题。我已经使用POCO类和我自己编写的Context对象为一个数据库创建了一个EDMX文件。当我为不同的数据库添加第二个EDMX时,我使用了POCO T4模板,然后EDMX都没有工作并抛出了你提到的错误。为了解决这个问题,我取消了我的自定义POCO和Context,只使用了T4模板,所有这些都再次运作良好。

答案 11 :(得分:0)

我遇到了一个问题,我在表格中添加了一些列。

在Table Mappings中,我重命名了列名。

虽然我已经运行了“转换所有模板”并重建了应用程序,但我仍然得到了'类型&lt;&gt;的关联元数据类型包含以下未知属性或字段&lt;&gt;'错误。

Domain.Poco.tt中此表的类是正确的,但我发现Domain.Poco.MetaData.tt中相应的class.Metadata.cs文件尚未更新,并且具有原始名称的新列 - 不是我在Table Mapping中指定的新的。

解决方案?我刚刚删除了有问题的元数据类,并重新运行了“转换所有模板”,并使用正确的列/函数名称正确地重新创建了它。

答案 12 :(得分:0)

我的问题是我编辑了T4模板以排除名为“msrepl_tran_version”的复制字段。这导致数据库与生成的类不匹配,这可能导致此错误消息。只需确保您的数据库和类匹配。