2012-01-26 8 views
4

エンティティのコンポーネントコレクションを更新する際に、現在問題があります。もともとバッグとしてマップされていましたが、そのたびにすべてのエントリが削除されて再挿入されていました。それをセットに変更すると、その問題は解決されましたが、新しいものが導入されました。コンポーネントを削除するときにNHibernateがnullと誤って比較しています

コンポーネントタイプはTrackingと呼ばれ、複合キーはUserIDItemIDであり、2つのプロパティはNULL可能な日付です。これらのうちの1つが作成されると、現在の時刻に設定されたDateReadは、その後、新しい日付のエントリに置き換えられます。

NHibernateで生成されるSQLには、すべてのプロパティが一致するかどうかをチェックするwhere句があります。

問題は、他の日付DateAcknowledgedは、多くの場合、nullであると生成されたSQLは、NULLがこれをやってチェックを行うために、構文エラーがあるようです:示すように、IS NULL= NULLをするのではなく

DELETE FROM TrackingTable 
    WHERE ItemId = 'a68f6dea-1c00-42e2-bc40-9fcf01121bd8' /* @p0 */ 
    AND UserId = 'c8aa41a4-e4c2-4347-ae6e-b48738a53b47' /* @p1 */ 
    AND DateRead = '2012-01-26T12:56:46.00' /* @p2 */ 
    AND DateAcknowledged = NULL /* @p3 */ 

問題は、削除するものを決定するために2つの日付が必要ではないということです。チェック・アイテムのIDとユーザーIDがあれば簡単です。ここで

は、私はセットを定義するマッピングコードです:

Set(x => x.Trackings, 
     mapper => 
       { 
        mapper.Key(k => k.Column("ItemId")); 
        mapper.Table("Tracking"); 
        mapper.Access(Accessor.NoSetter); 
       }, 
       collectionMapping => collectionMapping.Component(TrackingMap.Mapping())); 

そして、ここでは、コンポーネントのマッピングです:

public class TrackingMap 
    { 
     public static Action<IComponentElementMapper<Tracking>> Mapping() 
     { 
      return c => 
      { 
       c.ManyToOne(x => x.User, a => { a.Column("UserId"); a.ForeignKey("UserId"); }); 
       c.Property(x => x.DateRead); 
       c.Property(x => x.DateAcknowledged, a => a.NotNullable(false)); 
      }; 
     } 
    } 

はキーのみを使用するようにNHibernateを指示する方法はありますwhere節で、あるいは正しい方法でヌルを比較するか?

+1

マッピングファイルを確認できますか? – nachojammers

+0

マッピングごとにコードに慣れていない人にとって、hbm?は見えます。 – Dan

答えて

2

これはこれはサポートされていないことを指摘している部分7.2. Collections of dependent objectsで覆われている:

あなたは<セット>を使用している場合、複合要素のマッピングがヌル可能なプロパティをサポートしていないことに注意してください。 NHibernateは、オブジェクトを削除するときにレコードを識別するために各カラム値を使用する必要があります(コンポジットエレメントテーブルには別のプライマリキーカラムがありません)。これはヌル値では不可能です。コンポジット要素でヌル以外のプロパティのみを使用するか、>、<のリスト>,< >または<idbag>のリストを選択する必要があります。

1

条件を使用してNHibernateエンティティを削除する方法については、this answerを参照してください。削除するアイテムを決定し、日付比較を無視して安全に無視する場合は、ItemIdUserIdのみを使用できるようにする必要があります。

+0

私は実際に明示的にエントリを削除しません、私はコレクションにアイテムを追加して削除し、親アイテムの更新を呼び出します –

関連する問題