Две коллекции таблицы на иерархию классов в одном классе в NHibernate/Conform

Я столкнулся со следующим случаем: у меня есть таблица для каждой иерархии классов:

public abstract class Parent : BaseEntity, IHierarchyEntity
    {
    }  

public class ChildA : Parent
{
    public virtual string Name { get; set; }
}

public class ChildB : Parent
{
    public virtual string Value { get; set; }
}

public class Container : BaseEntity
{
    public Container()
    {
        CollectionOne = new HashSet<ChildA>();
        CollectionTwo = new HashSet<ChildB>();
    }

    public virtual ICollection<ChildA> CollectionOne { get; set; }

    public virtual ICollection<ChildB> CollectionTwo { get; set; }
}

Небольшая часть логики доменного сопоставления (это почти то же самое):

IEnumerable<Type> allPersistEntities = GetDomainEntities();
IEnumerable<Type> roots = allPersistEntities.Where(t => t.IsAbstract && t.InheritedFromBaseEntity());
IEnumerable<Type> hierarchyEntities = allPersistEntities.Where(t => typeof(IHierarchyEntity).IsAssignableFrom(t));
var hierarchyRoots = hierarchyEntities.Where(t => t.IsAbstract && t.InheritedFromBaseEntity());
orm.TablePerClassHierarchy(hierarchyRoots);

Когда я сохранил элементы, все в порядке, но когда я попытался их получить, я получил два из них в CollectionOne (тип ChildA) и ошибку во втором:

незаконный доступ к загрузке коллекции Что я вижу в sql:

NHibernate:
    SELECT
        container0_.Id as Id0_0_
    FROM
        CONTAINERS container0_
    WHERE
        container0_.Id=@p0;
    @p0 = 1 [Type: Int32 (0)] NHibernate:
    SELECT
        collection0_.ContainerId as Containe5_1_,
        collection0_.Id as Id1_,
        collection0_.Id as Id1_0_,
        collection0_.Name as Name1_0_
    FROM
        PARENTS collection0_
    WHERE
        collection0_.ContainerId=@p0;
    @p0 = 1 [Type: Int32 (0)] NHibernate:
    SELECT
        collection0_.ContainerId as Containe5_1_,
        collection0_.Id as Id1_,
        collection0_.Id as Id1_0_,
        collection0_.[Value] as Value3_1_0_
    FROM
        PARENTS collection0_
    WHERE
        collection0_.ContainerId=@p0;
    @p0 = 1 [Type: Int32 (0)]

Здесь нет поля дискриминатора. Можно ли это исправить?

1 ответ

Ты можешь попробовать:

var hierarchyRoots = hierarchyEntities.Except(roots);

Я думаю, что вам может потребоваться указать точные листья для отображения, я не думаю, что он будет предполагать, что он должен отображать все классы, наследуемые от корня, как tpch.

Другие вопросы по тегам