2010-02-28 30 views
36

我在使用Entity Framework 4.0 RC时遇到了异常。 我的实体框架模型封装在一个名为Procurement.EFDataProvider的私人程序集中,而我的POCO类在另一个程序集的内部Procurement.Core Core(业务逻辑)和EFDataProvider(数据访问)之间的关系是一个名为DataProvider的工厂无法找到EntityType错误的EF映射和元数​​据信息错误

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

objectSet = ObjectContext.CreateObjectSet<TEntity>(); 

我得到一个错误:

Mapping and metadata information could not be found for EntityType 'Procurement.Core.Entities.OrganizationChart'.

+2

今天早上我对此表示反对,我认为最简单的解决方案可能是使用POCO T4模板生成它们:http://blogs.msdn.com/b/adonet/archive/2010/01/ 25/walkthrough-poco-template-for-the-entity-framework.aspx经过大量的挖掘才发现了这一点,并且在我知道Google上找到它的时候并不是微不足道: -/ – Rup 2010-10-06 10:58:52

+0

@Rup:我已经下载并现在使用它。 – IAbstract 2011-04-30 14:02:10

回答

58

为别人处理的错误,我认为这是值得一提的是,我发现,造成这种(非常无益的)错误的一些情况:

  • 拼写错误的性质(区分大小写!)
  • 属性在POCO类缺少POCO和实体型之间
  • 类型不匹配(例如,为int的长代替)
  • 枚举的POCO(EF没有按根据我的理解,现在不支持枚举)

可能还有其他原因。

HTH

+0

感谢这些指针 - 节省时间。 – Stuart 2011-01-17 14:46:16

+1

非常有帮助。在我的情况下,我已经添加了一个属性到实体而不更新POCO类。 Thanks- – 2011-02-22 13:46:00

+0

对于任何想要尝试POCO/T4的人来说,只需谨慎一点,如果需要在生成对象后对其进行更改,则必须在模板级别执行此操作。这种为我杀死了,因为我现在没有时间弄清楚它。这只是一个供参考。否则,它是非常整洁。 – dyslexicanaboko 2012-08-28 21:46:59

12

这可能是因为EF找不到嵌入映射信息。您的连接字符串中,你可能会碰到这样的他:

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

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

你需要做的是为连接字符串提供更多关于映射信息嵌入位置的信息。在*更改为你的映射代码的特定组件名称:

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

如果失败了,找到大会,并直接使用它加载到您的ObjectContext:

ObjectContext.Metadataworkspace.LoadFromAssembly(); 
+0

这有帮助。在我的情况下,我已经重新命名了一个类,并且res字符串没有反映出这个变化。 – 2015-04-03 19:45:23

1

只是检查与财产拼写模拟

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

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

1

可能还有其他原因。我也拉了我的头发一晚。

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

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

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

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

0

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

0

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

0

我有一个问题,我已经添加了一些列到表。

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

尽管我运行了“Transform All Templates”并重新构建了应用程序,但我仍然得到'<>的关联元数据类型>包含以下未知属性或字段<>'错误。

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

解决方案?我刚刚删除了违规的元数据类,并重新运行了“Transform All Templates”,并且正确地重新创建了正确的列/函数名称。

0

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

我有自定义的POCO并通过复制EDMX文件到一个空白的新项目,并让它自动生成的实体,然后把它们比作什么,我已经在寻找差异帮助了我。

0

我的问题是我所编辑的T4模板排除名为“msrepl_tran_version”复制领域。这导致数据库不匹配可能导致此错误消息的生成的类。只要确保你的数据库和类匹配。

2

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

解决方案:

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

Related post

+0

您好,先生,您是英雄! – 2016-03-29 22:47:40

相关问题