1

流暢な nhibernate または nhibernate 自体 (つまり hbm ファイル) を使用して、クラスごとのテーブル戦略と階層ごとのテーブル戦略を組み合わせたいのですが、方法がわかりません。私は hbm よりも fluent の方が好きですが、それが無理なら hbm でも構いません。エンティティを ClassMap として導入し、その他すべてを流暢な SubClassMap として導入してこれをテストしましたが、流暢に生成された hbm ファイルでは、エンティティはクラスであり、他のすべては私が望んでいない結合クラスでした。この問題については、以下で詳しく説明します。

クラス階層:

    public class Entity
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public abstract class Person : Entity
{
    public string Phone { get; set; }
}

public class SystemUser : Person
{
    public string Password { get; set; }
}

エンティティ用に 1 つのテーブル、人用に 1 つのテーブル、およびそのすべての種類 (すべてのサブクラス) が必要です。つまり、Entity にはクラスごとのテーブル戦略を使用し、Person および SystemUser クラスには階層ごとのテーブル戦略を使用したいと考えています。データベース構造は次のようなものです。

EntityTable(ID(PK),Name)
PersonTable(EntityID(PK,FK),Phone,Password)    

助けていただければ幸いです。

4

1 に答える 1

0

EntityTable Id がデータベースで生成されていない場合 (とにかく NH によって推奨されていません)、トリックを使用できます

public PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Table("PersonTable");

        Id(p => p.Id, "EntityID").GeneratedBy.HiLo("100");

        DiscriminateSubClassesOnColumn("PersonType");

        Map(x => x.Phone);

        Join("EntityTable", join =>
        {
            join.KeyColumn("ID");
            join.Map(p => p.Name);
        });
    }
}


public SystemUserMap : SubclassMap<SystemUser>
{
    public SystemUserMap()
    {
        Map(x => x.Password);
    }
}
于 2011-12-21T12:30:32.537 に答える