实体框架代码首先,指向实体

时间:2011-10-17 10:25:42

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

当然这只是第一步。现在你需要发出/生成将使用你的新实体和上下文的代码 - 要知道EF不能与接口一起工作,并且继承是专门处理的,所以在大多数情况下你需要代码直接使用你的发射类型。