5

問題はかなり一般的なようですが、私は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を区別する識別子?
4

1 に答える 1

0

BossMap を EmployeeMap にエイリアスするだけの場合:

public class BossMap : EmployeeMap {}

必要なマッピングを取得する必要があります。

于 2012-10-24T22:10:06.490 に答える