删除组件时,NHibernate错误地将其与null进行比较

删除组件时,NHibernate错误地将其与null进行比较,nhibernate,mapping-by-code,Nhibernate,Mapping By Code,我当前在更新实体上的组件集合时遇到问题。它最初被映射为一个包,但这导致每次删除并重新插入所有条目。将其更改为集合解决了该问题,但引入了一个新问题 组件类型称为Tracking,它有一个由UserID和ItemID组成的复合键,以及两个可为空的日期属性。当其中一个被创建为DateRead设置为当前时间时,它随后会被一个新日期为on的条目替换 底层SQL NHibernate生成一个where子句,用于检查所有属性是否匹配 问题是,另一个日期DateAcknowledged通常为空,生成的SQL似乎

我当前在更新实体上的组件集合时遇到问题。它最初被映射为一个包,但这导致每次删除并重新插入所有条目。将其更改为集合解决了该问题,但引入了一个新问题

组件类型称为
Tracking
,它有一个由
UserID
ItemID
组成的复合键,以及两个可为空的日期属性。当其中一个被创建为
DateRead
设置为当前时间时,它随后会被一个新日期为on的条目替换

底层SQL NHibernate生成一个where子句,用于检查所有属性是否匹配

问题是,另一个日期
DateAcknowledged
通常为空,生成的SQL似乎有语法错误,要执行空检查,请执行以下操作:
=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 */
问题是,根本不需要这两个日期来决定删除什么。只要有where检查项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));
            };
        }
    }
public class TrackingMap
{
公共静态动作映射()
{
返回c=>
{
c、 manytone(x=>x.User,a=>{a.Column(“UserId”);a.ForeignKey(“UserId”);});
c、 属性(x=>x.DateRead);
c、 属性(x=>x.DateAcknowledged,a=>a.NotNullable(false));
};
}
}

有没有一种方法可以告诉NHibernate仅在where子句上使用键,或者让它以正确的方式比较空值?

有关如何使用条件删除NHibernate实体的详细说明,请参阅。这应允许您在确定要删除的项目时仅使用
ItemId
UserId
,并安全地忽略日期比较。

这在章节中介绍,其中指出不支持:

请注意,如果使用的是可空属性,则复合元素映射不支持可空属性。当删除对象时(复合元素表中没有单独的主键列),NHibernate必须使用每个列的值来标识记录,这对于空值是不可能的。您必须在复合元素中仅使用NOTNULL属性,或者选择,或


实际上,我并没有显式地删除条目,我只是从集合中添加和删除条目,并调用父条目上的更新。对于那些不习惯按代码映射的人,可能会看到hbm。