2009-07-27 5 views
9

まず、私は、次の表を持っている:流暢NHibernateは複合キーで保存エンティティ

public class CustomerHub 
{ 
    public int CustomerId {get;set;} 
    public int HubId {get;set} 

    //GetHashCode, Equals, Etc... 
} 

このマッピング使用:

を、私はこのエンティティにマッピングされている

CREATE TABLE CustomerHub (
    CustomerId INT NOT NULL, 
    HubId INT NOT NULL 
) 

public class CustomerHubMap : ClassMap<CustomerHub> 
{ 
    UseCompositeId() 
     .WithKeyProperty(x => x.CustomerId) 
     .WithKeyProperty(x => x.HubId); 
} 

問題は、CustomerHub型の新しいエンティティを作成して保存しようとすると、何も保持されないということですデータベースに転送します。私はすべてをうまく取り出すことができます。ただ保存しないでください。例:

//this will work 
var x = session.CreateCriteria(typeof(CustomerHub)); 

//this will not 
using (var trans = session.BeginTransaction()) 
{ 
    var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
    var y = session.SaveOrUpdate(custHub); 
    trans.Commit(); 
} 

例外は例外ではなく、単に何もしないことです。私はNH Profiler(優れたツール!)を起動し、データベースにどのようなタイプの挿入コマンドも発行していないようです。

思考?

注:このテーブルは、技術的には結合テーブルとよく似ていて、顧客などの別のエンティティでManyToMany関係になるのが最善だと思います...しかし、 (つまり、ハブ・テーブルがない場合)、結合テーブルをエンティティにマップしてそのように操作するのがさらに簡単です。

答えて

6

編集(一番上に置く)NHibernateのドキュメントから

引用:

、その固有の性質に、この発電機を使用するエンティティはISessionのするsaveOrUpdate()メソッドを使って保存することはできません。代わりに、オブジェクトをSAessionのSave()メソッドまたはUpdate()メソッドのいずれかを呼び出して保存または更新する必要があるかどうかを明示的にNHibernateに指定する必要があります。

http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id-assigned(5.1.4.7)

コンポジットID割り当て=ジェネレータを有しています。あなたはフラッシュを発行するか、コミットされていません:)


吸っ

これは、複合IDに戻って=。おそらく、保存時にINSERTを発行するアイデンティティのようなもので作業するのに慣れていますが、データベースではなくコードによってコンポジットが割り当てられるため、挿入を行うためのフラッシュ/コミットが必要です。


var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
var y = session.SaveOrUpdate(custHub); 
session.Flush(); 

または

using(var tx = session.BeginTransaction()) 
{ 
    var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
    var y = session.SaveOrUpdate(custHub); 
    tx.Commit(); 
} 

また、1注記:複合キーを使用するには、あなたがあなたの人生を憎むようになります。複合キーでは多くのことが同じように機能せず、すぐには分かりません。基本的に、NHibernateは仕事を少なくすることができますので、余裕を持って拾う必要があります。

+0

素早い回答ありがとうございます。簡潔にするために私はそれを残しましたが、私の呼び出しはすべて、2番目の例に非常に似た包み込まれたコードになっています。私も運がないとフラッシュを試みた。 – jckeyes

+0

が追加されました。私はSaveOrUpdateのことについて確信が持てませんでしたので、これがうまくいくかどうかを待っていました:p – anonymous

+0

最近SaveOrUpdateがどのように機能するかについてのセクションを読んでいました。おそらく彼らは試していないのかもしれません。 – anonymous

関連する問題