Entity framework 实体框架4中具有POCO实体的每个层次结构的表继承

Entity framework 实体框架4中具有POCO实体的每个层次结构的表继承,entity-framework,poco,entity-framework-4,single-table-inheritance,Entity Framework,Poco,Entity Framework 4,Single Table Inheritance,一旦v4问世,我们的组织希望在实体框架上实现标准化。因此,我正在研究如何使用POCO支持将使用NHibernate实现持久性的应用程序迁移到EF4。在一些地方,我们使用单表继承(也称为表/层次结构)。我无法使用以下命令使其正常工作 支付(基类[应该是抽象的,但也有问题]) 信用卡支付(具体实施) 支付(具体实施) 支票支付(具体实施) 现在,我只使用基类属性映射它们。所有这些类都在同一名称空间中。他们在数据库中有一个称为PaymentTypeId的判别符,因此付款映射的条件为“When Paym

一旦v4问世,我们的组织希望在实体框架上实现标准化。因此,我正在研究如何使用POCO支持将使用NHibernate实现持久性的应用程序迁移到EF4。在一些地方,我们使用单表继承(也称为表/层次结构)。我无法使用以下命令使其正常工作

支付(基类[应该是抽象的,但也有问题]) 信用卡支付(具体实施) 支付(具体实施) 支票支付(具体实施)

现在,我只使用基类属性映射它们。所有这些类都在同一名称空间中。他们在数据库中有一个称为PaymentTypeId的判别符,因此付款映射的条件为“When PaymentTypeId=0”。每个子类都具有相同的条件和不同的值(即CreditCardPayment=1,等等)

当我尝试使用DataContext.payments.ToList()(DataContext继承自ObjectContext)加载每个付款的所有付款列表时,我遇到以下异常:

“找不到标识为'DataLayer.DataModel.CreditCardPayment'的类型的对象映射。”

我无法理解这意味着什么,因为POCO CreditCardPayment类与POCO Payment类位于同一名称空间中(事实上位于同一个文件中)


我错过了什么

这不是抱怨数据库映射,而是抱怨模型到CLR的映射

由于某种原因,EF无法找到您的
CreditCardPayment

现在一个可能的原因是您还没有为它加载元数据

例如,如果您有:

Assembly 1:
 - Payment

Assembly 2 references Assembly 1:
 - CreditCardPayment extends Payment
当你查询EF时,你不知道CreditCardPayment住在哪里

解决此问题的方法是使用LoadAssembly,即:

using (DataContext ctx = new DataContext())
{
   ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly);

   // now do your query.

}
您需要告诉
loadfromsassembly
您的
DataContext
类没有直接引用的每个程序集

注意:
typeof(Payment).Assembly
是直接引用的,因为
IQueryable
Payments属性

希望这有帮助

亚历克斯


微软。

我以前没有提到的东西(我认为这与此无关,但事实确实如此)。CreditCardPayment继承自名为“CreditPayment”的中间类,ACHPayment继承自CashPayment。CreditCardPayment和CashPayment位于同一命名空间和文件中,但未在EF映射中表示。一旦我在映射文件中添加了这些,一切正常


因此,即使EF从未直接映射到这些类型之一,它似乎也需要了解它们,因为它更改了CreditCardPayment类等的基本类型。感谢您在这方面的帮助。

谢谢Alex。在DataContext类的构造函数中,我将“this.MetadataWorkspace.LoadFromAssembly(typeof(CreditorCardPayment).Assembly);”添加到“_payments=CreateObjectSet();”中,但“找不到类型的对象映射…”错误仍然存在。这些是POCO类(Payment和CreditorCardPayment),这会改变这里需要做的事情吗