找不到 EntityType 错误的 EF 映射和元数据信息
Posted
技术标签:
【中文标题】找不到 EntityType 错误的 EF 映射和元数据信息【英文标题】:EF Mapping and metadata information could not be found for EntityType Error 【发布时间】:2011-01-21 23:20:29 【问题描述】:我在使用 Entity Framework 4.0 RC 时遇到了异常。 我的实体框架模型封装在一个名为 Procurement.EFDataProvider 的私有程序集中,而我的 POCO 类位于另一个程序集 Procurement.Core 中 Core(业务逻辑)和 EFDataProvider(数据访问)之间的关系是一个名为 DataProvider 的工厂
所以当我尝试创建对象集时
objectSet = ObjectContext.CreateObjectSet<TEntity>();
我收到一个错误:
找不到实体类型“Procurement.Core.Entities.OrganizationChart”的映射和元数据信息。
【问题讨论】:
今天早上我已经对此表示反对,我认为最简单的解决方案可能是使用 POCO T4 模板来生成它们:blogs.msdn.com/b/adonet/archive/2010/01/25/… 花了相当多的挖掘才能找到这个,一旦我知道了它,我在谷歌上找到它并不是一件容易的事:-/ @Rup:我已经下载并使用它了。 【参考方案1】:对于其他处理该错误的人,我认为值得一提的是我发现的一些导致此(非常无用)错误的场景:
属性拼写错误(区分大小写!) POCO 类中缺少属性 POCO 和实体类型之间的类型不匹配(例如,int 而不是 long) POCO 中的枚举(据我了解,EF 目前不支持枚举)可能还有其他原因。
HTH
【讨论】:
非常有帮助。在我的例子中,我在没有更新 POCO 类的情况下向实体添加了一个属性。谢谢- 提醒任何打算尝试 POCO/T4 的人,如果您需要在生成对象后对其进行更改,则必须在模板级别进行。这对我来说是致命的,因为我现在没有时间弄清楚。这只是一个仅供参考。否则,它很整洁。 问题是当我们陷入“其他原因”问题时 或者您只是没有将实体添加到 DbModelBuilder 配置中【参考方案2】:这可能是因为 EF 找不到嵌入的映射信息。在您的连接字符串中,您可能会有类似他的内容:
metadata=res://*/Models.MyModels.csdl|...etc
那 * 是一个通配符,告诉对象上下文尝试从扫描所有加载的程序集中找到嵌入的映射信息。如果程序集未加载,EF 将找不到它。
您需要为连接字符串提供有关映射信息嵌入位置的更多信息。将 * 更改为映射代码的特定程序集名称:
metadata=res://Procurement.EFDataProvider/Models.MyModels.csdl
如果失败,请找到该程序集并使用以下命令直接将其加载到您的 ObjectContext 中:
ObjectContext.Metadataworkspace.LoadFromAssembly();
【讨论】:
这有帮助。在我的例子中,我重命名了一个类,而 res 字符串并没有反映这种变化。【参考方案3】:与上述没有直接关系,但如果您收到此错误消息并且您混合了 POCO 和常规模型:坏主意!
另请参阅来自 JRoppert 的评论 EF4 POCO (not using T4): Mapping and metadata information could not be found for EntityType(感谢 JRoppert!)
【讨论】:
【参考方案4】:我收到此错误是因为我在同一个程序集中有多个 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.
【讨论】:
【参考方案5】:在配置文件中没有指定连接字符串的时候我也看到过。
【讨论】:
【参考方案6】:另一个可能的问题是,如果您使用的是代码优先,并且您的实体类型在单独的程序集中定义到定义上下文的位置,而您没有将任何自定义映射添加到 OnModelCreating(DbModelBuild modelBuilder)
方法,然后 EF 似乎忽略了数据注释。
解决方案:
将modelBuilder.Entity<YourEntityType>();
添加到OnModelCreating(DbModelBuild modelBuilder)
方法中。
Related post.
【讨论】:
先生,您是英雄!【参考方案7】:只需用模型检查属性拼写
【讨论】:
【参考方案8】:可能还有其他原因。我还拉了一晚上头发。
我发现解决方案中的引用存在一些混乱。在我的项目中,edmx
属于一个名为 DataAccess.Dll
的项目。但我的 exe 没有提及它。在我的 exe 中,我引用了另一个名为 Business.Dll
的项目,并且该项目有 DataAccess.DLL
的引用和旧位置。
做如下测试,看看你有没有这样的问题:
-
打开 exe 项目的 bin 目录并保持可见。
构建解决方案。
要构建的第一个项目是数据访问项目,您可以在 bin 文件夹中看到当前时间作为其修改日期。
在构建其他项目时,您会看到 DataAccess 项目的修改日期已更改为旧日期。
您需要检查您的引用并确保它们引用您的 dll 的更新位置。
【讨论】:
【参考方案9】:在我的情况下,这本质上是相同的问题,映射与预期的不完全一样。发生在我身上的是,我将“按层次结构继承的表”中的一个属性从其中一个子类移动到了基类,却忘记更新模型。
我有自定义 POCO,并将 edmx 文件复制到一个空白的新项目并让它自动生成实体,然后将它们与我帮助我发现差异的内容进行比较。
【讨论】:
【参考方案10】:一个菜鸟错误,但是当我使用只读用户名和密码访问数据库时出现错误。希望我的错误对其他人有所帮助。
【讨论】:
【参考方案11】:我遇到了类似的问题。我已经使用 POCO 类和我自己编写的 Context 对象为一个数据库创建了一个 EDMX 文件。当我为不同的数据库添加第二个 EDMX 时,我使用了 POCO T4 模板,然后 EDMX 都不起作用并抛出了你提到的错误。为了解决这个问题,我废弃了我的自定义 POCO 和 Context,只使用了 T4 模板,一切都再次正常运行。
【讨论】:
【参考方案12】:我在表格中添加了一些列时遇到问题。
在表映射中,我重命名了列名。
虽然我已经运行了“转换所有模板”并重新构建了应用程序,但我仍然收到“类型 的关联元数据类型包含以下未知属性或字段 ”错误。
Domain.Poco.tt 中该表的类是正确的,但我发现 Domain.Poco.MetaData.tt 中对应的 class.Metadata.cs 文件没有更新,并且新列具有原始名称 -不是我在表映射中指定的新的。
解决方案?我刚刚删除了有问题的元数据类,然后重新运行“转换所有模板”,它被正确地重新创建,并具有正确的列/函数名称。
【讨论】:
【参考方案13】:我的问题是我编辑了 T4 模板以排除名为“msrepl_tran_version”的复制字段。这导致数据库与生成的类不匹配,从而导致此错误消息。只需确保您的数据库和类匹配即可。
【讨论】:
以上是关于找不到 EntityType 错误的 EF 映射和元数据信息的主要内容,如果未能解决你的问题,请参考以下文章
EF迁移时报错“未定义键。请为该 EntityType 定义键。
无法执行 FunctionImport“entitys.xx”,因为未将它映射到存储函数。EF
错误 175:在配置中找不到指定的存储提供程序,或者对 EF4 和 SQL Server CE 4 无效
错误。"找不到源自dbcontext的可构造类型"(Visual Studio 2019和EF 6工具)