2017-09-25 5 views
0

Je face à cas suivant: Je table par hiérarchie de classe:Deux collection de la table par hiérarchie de classe dans une classe dans le 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; } 
} 

petit morceau de logique mappeur Domaine (il s` s presque le même):

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); 

quand je sauvé des articles tout est ok, mais quand j'ai essayé de ceux que je reçois deux d'entre eux dans le type CollectionOne (Childa) et erreur dans le second:

illegal access to loading collection What I see in the sql:

NHibernate: 
    SELECT 
     container0_.Id as Id0_0_ 
    FROM 
     CONTAINERS container0_ 
    WHERE 
     [email protected]; 
    @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 
     [email protected]; 
    @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 
     [email protected]; 
    @p0 = 1 [Type: Int32 (0)] 

Il n'y a pas de champ de discriminateur. Est-il possible de le réparer?

Répondre

1

Pouvez-vous essayer:

var hierarchyRoots = hierarchyEntities.Except(roots); 

Je pense que vous pourriez avoir besoin de lui donner les feuilles exactes de carte, je ne pense pas que ça va l'assumer Dirigez tous classes héritant de la racine comme TPCH.

+0

Après cela se passe une erreur: Impossible de déterminer le type pour: Dlls.ChildA, DLLs, pour les colonnes: NHibernate.Mapping.Column (CollectionOneElement) On dirait Nhibernate 't préciser de quel type il est. –

+0

Je pense que soit il n'a pas compris le mappage de la relation FK, soit il n'a pas cartographié les classes. Est-ce lors de la sauvegarde ou de la lecture? Conform est capable de produire une copie xml du mapping qu'il crée. Essayez de produire cela et de comparer à ce qu'il devrait être - devrait vous donner une idée de ce que vous devez corriger. –