2011-12-21 13 views
1

流暢なnhibernateまたはnhibernate(hbmファイルを意味します)を使用してクラスごとのテーブルと階層ごとの戦略を組み合わせたいと思います。私はhbmに流暢であることを好むが、それが不可能な場合は、hbmもうまくいく。私はEntityをClassMapとして紹介し、他のすべてはSubClassMapとして流暢であるが、流暢で生成されたhbmファイルでEntityはクラスであり、他のすべてのクラスは私が望んでいないものであった。この問題については、後で詳しく説明します。2つの戦略を使用して流暢なnhibernateでクラス階層をマッピング

クラス階層:私は1つのエンティティのためのテーブルと、人のためのものと、それのすべての種類(そのすべてのサブクラス).Iは私がテーブル・クラスごとの戦略を使用する意味を持つようにしたい

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; } 
} 

PersonおよびSystemUserクラスのエンティティおよびテーブルごとの戦略。データベース構造は次のようなものです:

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

EntityTable Idが(とにかくNHによって推奨されて)生成されたデータベースではない場合

答えて

0

あなたはトリック

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); 
    } 
} 
+0

を使用することができますご返信いただきありがとうございますが、いや、これは私が欲しいものではありません。データベース構造と2つのテーブルを調べます。エンティティのためのものと、あらゆる種類のperson.infactの人のためのものは抽象です。 – user1109668

+0

は、ポストされたテーブル構造に対するマッピングです。 Personの階層とSystemUserの階層がありますが、両方ともtheire nameプロパティのEntityTableを共有しています。私が何を投稿したか以外には、 – Firo

+0

が意味するものをコンソールアプリケーションで 'SchemaExport(config).Execute(true、false、false)'を使って試してみてください。NHはdoesntが ' ' – Firo

関連する問題