2012-02-07 4 views
0

私は以下のオブジェクトモデルを持っています(変更できない従来のテーブル構造に基づいています)。NHibernateを「非正規化」テーブルにマッピングする

public class Store 
    Contact BillingContact {get;set;} 
    Contact SetupContact {get;set;} 
    ISet<Contact> Contacts {get;set;} 

このシナリオでは、新しいストアを作成するときに、連絡先リストに新しい連絡先も追加します。また、その連絡先をBillingContactとSetupContactの参照に設定する必要があります。その後、1つのトランザクションとしてロットを保存します。参照をBillingContactとSetupContactに設定せずにストアを保存すると、すべて正常です。しかし、これらのプロパティを設定すると、NHibernateはInsertの後にUpdateを実行して参照を更新しようとしますが、Storeが実際にはまだ挿入されていないのでエラーが発生します。

トリガまたはストアドプロシージャを使用する必要があるようですが、NHibernateの方法があることを期待しています。

実行中のSQLは、次に

INSERT INTO CONTACTS (Id, CompanyId, Name, etc.) Values (1234, NULL, "My Contact", etc.) NOTE: 1234 was retrieved from a sequence 

その後

INSERT INTO company (Id, BillingContactId, SetupContactId) Values (8946, 1234, 1234) 

ある - インサートが、最後の文が失敗したコミットされていないので、エラーがあるため、この

UPDATE CONTACTS SET CompanyId=8946 WHERE CUSTOMER_ID = 1234 AND TimeStamp = xxx 

です。

エラーが 行が更新または削除別のトランザクションによって(または保存されていないと値のマッピングが間違っていました)している[顧客番号1234]

+0

Sql nHibernateの実行中、保存コード、および取得しているエラーを含めることはできますか? –

答えて

0

あなたは、保存・更新をするためにそれらの参照のためのカスケードを設定する必要があります。つまり、エンティティを保存または更新すると、「カスケード」という参照が保存されます。 マッピングセクションで

http://wiki.fluentnhibernate.org/Getting_started

は、カスケードとの例があります。

+0

両方の参照がSaveUpdateに設定されています。私はその問題が私がコレクションにも追加しているからだと思う。 – Steven

関連する問題