每个层次结构的表继承与实体框架4中的POCO实体

时间:2009-12-06 22:32:43

标签: entity-framework poco entity-framework-4 single-table-inheritance

我们的组织希望在v4发布后对实体框架进行标准化。因此,我正在研究如何使用POCO支持将使用NHibernate持久性的应用程序迁移到EF4。在几个地方,我们使用单表继承(也称为Table Per Hierarchy)。我使用以下内容无法使其工作。

付款(基类[应该是抽象的,但也有麻烦]) CreditCardPayment(具体实施) ACHPayment(具体实施) CheckPayment(具体实施)

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

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

“无法找到具有标识'DataLayer.DataModel.CreditCardPayment'的Type的对象映射。”

我无法弄清楚这意味着什么,因为POCO CreditCardPayment类与POCO Payment类存在于同一名称空间中(事实上在同一文件中)。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

这不是抱怨数据库映射,而是模型到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.

}

您需要告诉LoadFromAssembly每个不是DataContext班级直接引用的汇编。

注意:typeof(Payment).Assembly由于IQueryable<Payment>付款属性而被直接引用。

希望这有帮助

亚历

微软。

答案 1 :(得分:0)

我以前没有代表过的(我认为它不相关,但确实如此)。 CreditCardPayment是继承自名为“CreditPayment”的中间类,还是继承自CashPayment的ACHPayment。 CreditCardPayment和CashPayment存在于相同的命名空间和文件中,但未在EF映射中表示。一旦我在映射文件中添加了那些,一切正常。

所以,即使EF没有直接映射到其中一种类型,它似乎需要了解它们,因为它改变了CreditCardPayment类等的基本类型。感谢您的帮助。

相关问题