問題はかなり一般的なようですが、私はfluentnhibernateを初めて使用し、すべての検索で有用なものは見つかりませんでした。
私はこれに似たクラス階層を持っています:
public class Person
{
public virtual int Id { get; protected set; }
public virtual string GivenName { get; set; }
public virtual string FamilyName { get; set; }
}
public class Employee : Person
{
public virtual string WhoAmI { get { return "I am just an Employee"; } protected set { } }
}
public class Boss : Employee
{
public override string WhoAmI { get { return "I am the boss."; } protected set { } }
}
つまり、1つの基本クラスと2つのサブクラス(一方は他方から派生)です。サブクラスには同じシグニチャがありますが、基本クラスにはありません。
以下のマッピングは、3つのクラスのインスタンスに関するすべての情報を同じテーブルに配置します。
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(x => x.Id);
Map(x => x.GivenName);
Map(x => x.FamilyName);
DiscriminateSubClassesOnColumn("type");
}
}
public class EmployeeMap : SubclassMap<Employee>
{
public EmployeeMap()
{
Map(x => x.WhoAmI);
}
}
public class BossMap : SubclassMap<Boss>
{
public BossMap()
{
}
}
DiscriminateSubClassesOnColumnを省略すると、次の3つのテーブルが生成されます。
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(x => x.Id);
Map(x => x.GivenName);
Map(x => x.FamilyName);
}
}
public class EmployeeMap : SubclassMap<Employee>
{
public EmployeeMap()
{
Map(x => x.WhoAmI);
}
}
public class BossMap : SubclassMap<Boss>
{
public BossMap()
{
}
}
私の質問:(流暢に)これらのクラスを正確に2つのテーブルにマップすることは可能ですか?
- Personクラスから派生したすべてのプロパティを保持する1つのPersonテーブル、および
- Employeeクラスから派生したすべてのプロパティを保持するEmployeeテーブルに加えて、通常のEmployeesとBossesを区別する識別子?