【问题标题】:Entity Framework Code First, pointing to the entitiesEntity Framework Code 首先,指向实体
【发布时间】:2011-10-17 10:25:41
【问题描述】:

我收到异常“实体类型 [TYPE] 不是当前上下文模型的一部分。”尝试运行我的应用程序时。

到目前为止,我最好的猜测是它不会将我的类型识别为它已映射的类型。这很可能是因为它是在运行时加载的类型。此类型来自不同的程序集。

EF: CF 如何找到要映射的所有实体,如何让它找到我的类型?

【问题讨论】:

  • 运行时加载的类型是什么意思?
  • 该类型不存在于当前程序集中,但它是在运行时加载的。更详细地说,它是通过 Reflection.Emit 创建的。

标签: entity-framework-4.1 ef-code-first


【解决方案1】:

EF 并非旨在直接支持此功能。 EF 是 ORM,而 ORM 主要是在您指定要在设计时使用和映射的类型并在运行时简单地使用它们时创建的。这并不意味着不能在运行时创建类型(使用代码映射),而是要复杂得多。

上下文必须知道它应该映射的所有类型以及它们的映射。如果您创建上下文而不引用您的新类型,它根本不知道它。如何解决?我可以考虑两种选择:

  • 同时发出上下文代码并确保发出的上下文代码包含DbSet<YourEmittedEntityType> 类型的公共属性(以使用默认映射约定)或发出OnModelCreating 方法以及指定自定义映射。
  • 也为您的新实体发出配置(源自EntityTypeConfiguration<YourEmittedEntityType>)类。此类将指定新实体到您的数据库表的映射。完成配置后,您可以手动创建 DbModelBuilder 注册所有必要的实体类型配置,包括在运行时创建的新配置,构建 DbModel,编译它并使用 DbCompiledModel 构建 DbContext 的新实例。只需让用户缓存DbCompiledModel 以供后续使用,因为它的构建非常耗时。

在这两种情况下,请确保已创建用于持久化和检索新实体的表并关闭任何数据库初始化程序 - 您必须手动维护数据库。

当然,这只是第一步。现在您需要发出/生成将使用您的新实体和上下文的代码 - 请注意,EF 不适用于接口并且继承是专门处理的,因此在大多数情况下您需要代码直接使用您发出的类型。

【讨论】:

  • 我只是想我可以先告诉 EntityFramework Code 我的类型。好像很奇怪,我不能。代码就在那里,因为它需要发现和注册“正常”类型。你会认为我可以注册额外的类型,并让 EF:CF 处理所有其余的。感谢您的信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 2011-10-29
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多