10

私は次のシナリオを持っています

public abstract class BaseClass
{
  public virtual int Id {get; set};
  public virtual string Name {get; set;}
}

public class FirstSubClass : BaseClass
{
   //properties and behaviour here
}

public class SecondSubClass : BaseClass
{
  //properties of SecondSubclass Here
}

public class ProcessStep
{
   public virtual IList<BaseClass> ContentElements {get; set;}  
}

マッピングには、次のコード スニペットを使用しました:-

this._sessionFactory =
                          Fluently.Configure().Database(SQLiteConfiguration.Standard
                          .ConnectionString(@"Data Source=SqliteTestSqlDataAccess.s3db;    Version=3; New=True; Pooling=True; Max Pool Size=1;"))
                          .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(assemblyWithDomainClasses).Conventions.Add(DefaultCascade.All())))
                          .ExposeConfiguration(BuildSchema)
                          .BuildSessionFactory();

デフォルトでは、流暢は BaseClass である抽象基本クラスを無視します。しかし、クラスProcessStepにはIListを返すプロパティ ContentElements があるため、例外が発生します:- NHibernate.MappingException : 関連付けがマップされていないクラスを参照しています: BaseClass

IncludeBase(typeof(BaseClass)) を使用して基本クラスを含めると、正常に動作しますが、BaseClass および Derived クラスのテーブルが作成され、レコードは FK-PK 関係 (サブクラスごとのテーブル) にリンクされます。私が達成したいのは、具体的なクラスごとのテーブルです。つまり、各派生クラスには独自のテーブルがあり、派生クラスのすべてのプロパティ + 基本クラスのプロパティがあります。それを達成する方法はありますか?

4

2 に答える 2

9

あなたのマッピングを見たことがないので、私のものを提供させてください。このようにすることでこれを達成できます

public class BaseClassMap:ClassMap<BaseClass>
{
    public BaseClassMap()
    {
        /*
         * Identity generator can't be native because subclass objects should be unique
         * So use HiLo or Guid or other generators which will generate unique id on the child tables
         */
        Id(x => x.Id).GeneratedBy.Guid(); 
        Map(x => x.Name);
        UseUnionSubclassForInheritanceMapping(); // This is important - uses union-subclass mappings for the derived classes
    }
}

public class FirstSubClassMap : SubclassMap<FirstSubClass>
{
    public FirstSubClassMap()
    {
        Table("FirstSubClassTable");
        // Map properties for FirstSubClass
    }
}

public class SecondSubClassMap : SubclassMap<SecondSubClass>
{
    public SecondSubClassMap()
    {
        Table("SecondSubClassTable");
        // Map properties for SecondSubClass
    }
}
于 2011-09-29T06:41:34.167 に答える