5

シャープアーキテクチャーライト(Sharp Architecture Lite)は、設定に関する慣例を強調し、NHibernate ConventionModelMapperの仕組みを理解しようとしています。具体的には、私は& IsEntity方法以下IsRootEntity間の違いを見分けることができない(BTW、Entity抽象クラスシャープアーチに付属ある):私は、IsEntity方法はNHibernateのに通知するために使用されていることを集めるNHibernate ConventionModelMapper; IsRootEntityと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; 
      } 
    } 

はクラスはDBへのマッピング/永続性の対象となります。しかし、私の人生のためには、IsRootEntityメソッドが何をしているのか理解できません。 ConventionModelMapperのドキュメントは悲惨です。あなたはケースを検討している場合

答えて

1

:それらをマッピングする場合

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

を、AとBの両方がエンティティ(IsEntityが彼らのためにtrueを返す必要があります)であり、NHibernateのは、しかし、Bのサブクラスとしてエンティティをマッピングしますすべてのエンティティの基本クラス(通常はこの基本クラスがマップされないようにするため)にマッピングされるべきではないため、IsRootEntityはEntityに対してtrueを返し、すべてのサブクラスに対してfalseを返します。それは "ルート"クラスのため

+0

あなたのケースでは、IsEntity()はAとBに対してtrueを返すべきですが、IsRootEntityはB. Entity()はIsEntity()のサブセットでなければならず、クラスの継承のマッピングを制御するためにのみ使用されます。たとえば、AとBの両方でIsRootEntityをtrueに設定すると、すべてのプロパティを2つの別々のクラスとしてマップします。 – dotjoe

関連する問題