39

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

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

objectSet = ObjectContext.CreateObjectSet<TEntity>();

我收到一个错误:

找不到实体类型“Procurement.Core.Entities.OrganizationChart”的映射和元数​​据信息。

4

13 回答 13

63

对于其他处理该错误的人,我认为值得一提的是我发现导致此(非常无用)错误的一些场景:

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

可能还有其他原因。

高温高压

于 2010-08-09T11:33:55.493 回答
12

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

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

那 * 是一个通配符,告诉对象上下文尝试从扫描所有加载的程序集中找到嵌入的映射信息。如果程序集未加载,EF 将找不到它。

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

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

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

ObjectContext.Metadataworkspace.LoadFromAssembly();
于 2010-03-01T05:13:53.110 回答
3

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

另请参阅 JRoppert 在EF4 POCO(不使用 T4)的评论:找不到 EntityType 的映射和元数​​据信息(感谢 JRoppert!)

于 2011-05-20T02:48:16.190 回答
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.
于 2011-07-28T15:16:16.833 回答
2

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

于 2012-01-07T01:02:56.780 回答
2

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

解决方案:

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

相关帖子

于 2015-01-14T11:51:27.943 回答
1

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

于 2010-07-13T18:12:01.210 回答
1

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

我发现解决方案中的引用存在一些混乱。在我的项目中,edmx属于一个名为DataAccess.Dll. 但我的 exe 没有提及它。从我的 exe 中,我引用了另一个名为 的项目Business.Dll,并且该项目具有DataAccess.DLL.

做以下测试,看看你是否有这样的问题:

  1. 打开 exe 项目的 bin 目录并保持可见。
  2. 构建解决方案。
  3. 将要构建的第一个项目是数据访问项目,您可以在 bin 文件夹中看到当前时间作为其修改日期。
  4. 在构建其他项目时,您会看到 DataAccess 项目的修改日期已更改为旧日期。

您需要检查您的引用并确保它们引用您的 dll 的更新位置。

于 2012-01-20T11:22:38.747 回答
1

就我而言,这本质上是相同的问题,映射并不完全符合预期。发生在我身上的是,我将“按层次结构继承的表”中的一个属性从一个子类移动到了基类,却忘记了更新模型。

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

于 2012-06-24T14:13:04.070 回答
0

一个菜鸟错误,但是当我使用只读用户名和密码访问数据库时出现错误。希望我的错误对其他人有所帮助。

于 2012-02-08T18:36:02.923 回答
0

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

于 2012-04-27T20:38:57.577 回答
0

我有一个问题,我在表中添加了一些列。

在表映射中,我重命名了列名。

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

Domain.Poco.tt 中该表的类是正确的,但我发现 Domain.Poco.MetaData.tt 中相应的 class.Metadata.cs 文件没有更新,并且新列具有原始名称 - 而不是新列我在表映射中指定的那些。

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

于 2012-05-02T10:18:24.873 回答
0

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

于 2013-06-04T14:41:34.060 回答