删除组件时,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。