我得到异常'实体类型[TYPE]不是当前上下文模型的一部分。在尝试运行我的应用程序时。
到目前为止,我最好的猜测是它不能将我的类型识别为它已映射的类型。这很可能是因为它是在运行时加载的类型。这种类型来自不同的组件。
EF:CF如何找到要映射的所有实体,如何让它找到我的类型?
答案 0 :(得分:0)
EF不是为直接支持此功能而设计的。 EF是ORM,当您指定要使用的类型并在设计时映射并在运行时简单地使用它时,ORM主要是为了目的而创建的。这并不意味着不可能在运行时创建类型(使用代码映射),但它要复杂得多。
上下文必须知道它应该映射的所有类型以及它们的映射。如果您创建的上下文没有引用您的新类型,它根本就不知道它。怎么解决?我可以考虑两个选择:
DbSet<YourEmittedEntityType>
的公共属性(使用默认映射约定)或发出OnModelCreating
方法以指定自定义映射。EntityTypeConfiguration<YourEmittedEntityType>
)类。此类将指定新实体到数据库表的映射。完成配置后,您可以手动创建DbModelBuilder
注册所有必需的实体类型配置,包括在运行时创建的新实体,构建DbModel
,编译它并使用DbCompiledModel
构建新的实例DbContext
。只需让用户为后续用法缓存DbCompiledModel
,因为它的构造非常耗时。在这两种情况下,请确保已创建用于保留和检索新实体的表,并关闭所有数据库初始化程序 - 您必须手动维护数据库。
当然这只是第一步。现在你需要发出/生成将使用你的新实体和上下文的代码 - 要知道EF不能与接口一起工作,并且继承是专门处理的,所以在大多数情况下你需要代码直接使用你的发射类型。