2010-12-17 17 views
0

に明示的なIdマッピングを避ける方法はありますか?C# - Fluent NHibernateマッピングの質問

私は何とか自動的にエントリIDを生成したいので、クラスの一部として導入する必要はありません。

public class HeyMapping 
{ 
    public String Name { get; set; } 
    public DateTime Timestamp { get; set; } 
} 

public class HeyMapping : ClassMap<HeyMapping> 
{ 
    public HeyMapping() 
    { 
     Not.LazyLoad(); 

     // I'm not particularly sure how this line works, but 
     // it fails the mapping unit test. 
     CompositeId().KeyProperty(x => x.Name); 

     Map(x => x.Name).Not.Nullable().Length(64); 
     Map(x => x.Timestamp).Not.Nullable(); 
    } 
} 

答えて

2

あなたが持っているしたい場合はノーIDエンティティでが、あなたはまだNHibernateのは、使用するデータベース列を知っているので、同上をマップする必要があります。

あなたは

Id<TColumnDataType>("column_name"); 

を呼び出すことができますがあなたには、いくつかのNHibernateの機能をあきらめて(特に連鎖更新とSaveOrUpdate()を呼び出す機能)とデータベースのみの同一性を有するため、データベース側でのパフォーマンスの低下を招きますのでご注意ください(私はNHibernateが比較のために余分なクエリを作らなければならないと思う)。

私は通常、この点を認めると自分のドメインクラス内の1つの永続化の懸念としてIdを許可するので、私はこれを行うだろう:

public class HeyMapping 
{ 
    protected internal int Id { get; set; } // persistence concern 

    public virtual String Name { get; set; } 
    public virtual DateTime Timestamp { get; set; } 
} 

私はあなたがこれを行うにはしたくないかもしれません実現。私はトレードオフがあることをあなたに知らせるだけです。

1

あなたのマッピングされたエンティティのすべてが継承する基本クラスを作成し、お使いのベースクラスにIdプロパティを追加します。

関連する問題