【问题标题】:Why can't NHibernate use Identity in union-subclass Table per Concrete Class mapping?为什么 NHibernate 不能在每个具体类映射的联合子类表中使用身份?
【发布时间】:2012-02-24 23:01:35
【问题描述】:

有几个消息来源指出 NHibernate 不能对每个具体类和联合子类的表使用标识。这是真的吗,这背后的确切原因是什么?

【问题讨论】:

    标签: c# nhibernate nhibernate-mapping table-per-class union-subclass


    【解决方案1】:

    为什么这么说?我想我有几个这样的场景。这个blog entry 也是一样的。

    总结以下cmets: 与 Ayende 的示例一样,如果您查询所有根类型(因此“选择方”),您可以获得 ID 的重复项。这一事实以及 UNION 特性(仅返回不同的记录)可能会给您带来意想不到的结果(丢失记录)。这就是为什么你不能使用身份,而是使用 hilo,它允许 nhibernate 避免重复。

    【讨论】:

    • 同一来源指出:“请注意,无法将身份与联合子类一起使用,因此我切换到 hilo,”
    • 你说得对。我想我使用了“每个子类的表”方法
    • 好吧,我认为这是因为您根本无法保证那里不会发生冲突。查看源代码并查找“Select Party”示例。使用生成器,您最终可能会拥有重复的 ID。
    • 没错,但是通过不使用 union-sublass,您可以使用身份,因此,您也可以有重复的 Id,所以这不是 NHibernate 的问题。那么,这里与联合子类有什么区别?我认为这是与 SQL UNIONS 或其他特定内容有关的问题,我只是不确定......
    • 我很确定我已经回答了为什么会这样。与 Ayende 的示例一样,如果您查询所有(因此,“选择方”),您可以获得 ID 的重复项。这一事实以及 UNION 特性(仅返回不同的记录)可能会给您带来意想不到的结果(丢失记录)。这不是很明显吗?另一方面,如果 yopu 以某种方式决定使用 UNION ALL,您可能会得到重复项,而这种方法确实可以避免这种情况。这就是为什么它说你不能使用身份,而是使用 hilo,它允许 nhibernate 避免重复。
    【解决方案2】:

    这很简单。 POID 在根实体类型的所有实例中必须是唯一的。

    考虑以下示例:

    abstract class Vehicle { ... }
    class Car : Vehicle { ... }
    class Truck : Vehicle { ... }
    

    如果您要检索车辆您不知道具体类型

    var carOrTruck = session.Get<Vehicle>(vehicleId);
    

    ...同时存在具有该 ID 的 Car 和 Truck(这可能与身份有关),NHibernate 会返回哪一个? (有更复杂的情况,但这说明了一个可能的问题)

    因此,对于 table-per-concrete-class(如果你问我,这是一个非常糟糕的策略),NHibernate 需要一个能保证子类之间唯一性的生成器。

    【讨论】:

    • 如果你调用同一个 session 会发生什么。Get 在隐式多态的情况下(没有联合的每个具体的表,只是普通的类映射),其中每个表都有自己的身份?
    • 我也指的是这个问题:stackoverflow.com/questions/9097933/…
    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 2011-11-26
    • 2017-04-07
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多