エンティティのコンポーネントコレクションを更新する際に、現在問題があります。もともとバッグとしてマップされていましたが、そのたびにすべてのエントリが削除されて再挿入されていました。それをセットに変更すると、その問題は解決されましたが、新しいものが導入されました。コンポーネントを削除するときにNHibernateがnullと誤って比較しています
コンポーネントタイプはTracking
と呼ばれ、複合キーはUserID
とItemID
であり、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節で、あるいは正しい方法でヌルを比較するか?
マッピングファイルを確認できますか? – nachojammers
マッピングごとにコードに慣れていない人にとって、hbm?は見えます。 – Dan