5

Używam Sharp Architecture Lite, która kładzie nacisk na konwencję na konfigurację i próbuje zrozumieć, jak działa NHibernate ConventionModelMapper. W szczególności, nie mogę powiedzieć różnicę między IsRootEntity & metody IsEntity poniżej (BTW, Entity jest klasą abstrakcyjną, że statki z ostrymi Arch):NHibernate ConventionModelMapper; Jaka jest różnica między IsRootEntity i 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; 
      } 
    } 

wnoszę, że metoda IsEntity służy powiedzieć NHibernate, które klasy kwalifikują się do mapowania/trwałości do bazy danych. Jednak nie mogę dla całego życia dowiedzieć się, co robi metoda IsRootEntity. Dokumentacja około ConventionModelMapper jest żałośnie rzadka.

Odpowiedz

1

Jeśli wziąć pod uwagę postępowania:

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

Kiedy ich odwzorowanie zarówno A i B są podmioty (IsEntity powinien wrócić prawdziwe dla nich), a NHibernate będzie mapować jako podklasa B. Jednak, podmiot nie powinno się mapować, ponieważ jest to klasa podstawowa dla wszystkich encji (zazwyczaj nie chcemy, aby ta klasa podstawowa była odwzorowywana), więc IsRootEntity zwróci wartość true dla Entity i false dla wszystkich jej podklas - co oznacza, że ​​Entity nie powinno być odwzorowane ponieważ jest to klasa "root"

+0

Dla twojej sprawy IsEntity() powinna zwracać wartość true dla A i B, podczas gdy IsRootEntity powinna zwracać wartość true tylko dla B. IsRoot Podmiot() powinien być podrzędnym zbiorem IsEntity() i jest używany tylko do kontrolowania mapowania dziedziczenia klas. Na przykład, jeśli ustawisz IsRootEntity na wartość true dla A i B, mapowane będą wszystkie ich właściwości jako dwie oddzielne klasy. – dotjoe