【问题标题】:Table per hierarchy inheritance with POCO entities in Entity Framework 4Entity Framework 4 中 POCO 实体的每个层次结构继承表
【发布时间】:2023-04-09 20:54:01
【问题描述】:

我们的组织希望在 v4 发布后实现实体框架的标准化。因此,我正在研究如何使用 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 类位于同一个命名空间中(实际上在同一个文件中)。

我错过了什么?

【问题讨论】:

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


    【解决方案1】:

    这不是在抱怨数据库映射,而是在抱怨模型到 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 类未直接引用的每个程序集。

    注意:由于IQueryable<Payment> Payments 属性,直接引用了typeof(Payment).Assembly。

    希望对你有帮助

    亚历克斯

    微软。

    【讨论】:

    • 谢谢亚历克斯。在我的 DataContext 类的构造函数中,我添加了“this.MetadataWorkspace.LoadFromAssembly(typeof(CreditorCardPayment).Assembly);”到“_payments = CreateObjectSet();”但是“找不到类型的对象映射...”错误仍然存​​在。这些是 POCO 类(Payment 和 CreditorCardPayment),这会改变这里需要做的事情吗
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多