1

一旦 v4 发布,我们的组织正在寻求对 Entity Framework 进行标准化。因此,我正在研究如何使用 POCO 支持将使用 NHibernate 进行持久性的应用程序迁移到 EF4。在一些地方,我们使用单表继承(也称为 Table Per Hierarchy)。我无法使用以下方法使其工作。

支付(基类[应该是抽象的,但也有问题]) CreditCardPayment(具体实现) ACHPayment(具体实现) CheckPayment(具体实现)

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

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

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

我不知道这意味着什么,因为 POCO CreditCardPayment 类与 POCO Payment 类位于同一个命名空间中(实际上在同一个文件中)。

我错过了什么?

4

2 回答 2

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>Payments 属性而直接引用。

希望这可以帮助

亚历克斯

微软。

于 2009-12-07T06:17:56.963 回答
0

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

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

于 2009-12-07T15:50:20.080 回答