5

Sto giocando con Sharp Architecture Lite, che enfatizza la convenzione sulla configurazione e cercando di capire come funziona l'NHibernate ConventionModelMapper. In particolare, non riesco a capire la differenza tra l'IsRootEntity & metodi IsEntity di seguito (a proposito, Entity è una classe astratta che viene fornito con Sharp Arco):NHibernate ConventionModelMapper; Qual è la differenza tra IsRootEntity e IsEntity

 internal static class Conventions 
     { 
     public static void WithConventions(this ConventionModelMapper mapper, Configuration configuration) { 
       Type baseEntityType = typeof(Entity); 

       mapper.IsEntity((type, declared) => IsEntity(type)); 
       mapper.IsRootEntity((type, declared) => baseEntityType.Equals(type.BaseType)); 

     public static bool IsEntity(Type type) { 
       return typeof(Entity).IsAssignableFrom(type) 
         && typeof(Entity) != type 
         && !type.IsInterface; 
      } 
    } 

ho capito che il metodo IsEntity viene usata per dire che NHibernate le classi sono idonee per mappatura/persistenza nel DB. Tuttavia, non riesco a capire come funziona il metodo IsRootEntity. La documentazione intorno a ConventionModelMapper è tristemente sparsa.

risposta

1

Se si considera il caso:

class B : Entity { ... } 
class A : B { ... } 

Quando li mappatura, sia A che B sono entità (IsEntity deve restituire true per loro), e NHibernate mapperà A come una sottoclasse di B. Tuttavia, Entity non deve essere mappato perché è una classe base per tutte le entità (in genere non si vorrà che questa classe base sia mappata), quindi IsRootEntity restituirà true per Entity e false per tutte le sottoclassi di esso - indicando quindi che Entity non deve essere mappata poiché è una classe "root"

+0

Per il tuo caso, IsEntity() deve restituire true per A e B, mentre IsRootEntity deve restituire true solo per B. IsRoot Entity() dovrebbe essere un sottoinsieme di IsEntity() e viene utilizzato solo per controllare il mapping dell'ereditarietà delle classi. Ad esempio, se si imposta IsRootEntity su true per entrambi A e B, verranno mappate tutte le loro proprietà come due classi separate. – dotjoe