現在、エンティティのコンポーネント コレクションを更新するときに問題があります。元々はバッグとしてマップされていましたが、そのため毎回すべてのエントリが削除され、再挿入されていました。それをセットに変更すると、その問題は修正されましたが、新しい問題が発生しました。
コンポーネント タイプは、 とTracking
の複合キーUserID
とItemID
、null 許容の日付である 2 つのプロパティを持つと呼ばれます。これらのいずれかが現在の時刻に設定されて作成DateRead
されると、後で新しい日付のエントリに置き換えられます。
NHibernate が生成する基になる SQL には、すべてのプロパティが一致することを確認する where 句があります。
問題は、他の日付DateAcknowledged
が null であることが多く、生成された SQL に構文エラーがあるように見えることです。null チェックを行うには、次のように: = NULL
ではなく:を実行しIS 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 句でのみキーを使用するように指示する方法、または null を正しい方法で比較するように指示する方法はありますか?