4

現在、エンティティのコンポーネント コレクションを更新するときに問題があります。元々はバッグとしてマップされていましたが、そのため毎回すべてのエントリが削除され、再挿入されていました。それをセットに変更すると、その問題は修正されましたが、新しい問題が発生しました。

コンポーネント タイプは、 とTrackingの複合キーUserIDItemID、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 を正しい方法で比較するように指示する方法はありますか?

4

2 に答える 2

1

基準を使用して NHibernate エンティティを削除する方法の適切な説明については、この回答を参照してください。ItemIdこれにより、削除するアイテムを決定するときにのみandを使用UserIdでき、日付の比較を安全に無視できます。

于 2012-01-26T14:42:53.167 に答える