我们的组织希望在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类存在于同一名称空间中(事实上在同一文件中)。
我错过了什么?
答案 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类等的基本类型。感谢您的帮助。