C# Nhibernate无法删除具有null属性值的值对象
我在nhibernate遇到了这样的问题:C# Nhibernate无法删除具有null属性值的值对象,c#,nhibernate,null,components,C#,Nhibernate,Null,Components,我在nhibernate遇到了这样的问题: NHibernate: DELETE FROM RilevanzaFinding_T045 WHERE int_T045_IdFinding = @p0 AND dte_T045_DataFine = @p1 AND nvc_T045_Note = @p2 AND int_T045_IdRating = @p3;@p0 = 201 [Type: Int32 (0:0:0)], @p1 = NULL [Type: DateTime (0:0:0)],
NHibernate: DELETE FROM RilevanzaFinding_T045 WHERE int_T045_IdFinding =
@p0 AND dte_T045_DataFine = @p1 AND nvc_T045_Note = @p2 AND int_T045_IdRating
= @p3;@p0 = 201 [Type: Int32 (0:0:0)], @p1 = NULL [Type: DateTime (0:0:0)], @p2 = 'GD675PFN2GTR9EUJ3JHPG7XFX' [Type: String (1073741823:0:0)],
@p3 = 243 [Type: Int32 (0:0:0)]
当我尝试删除属性值为null的组件(没有ID的对象)时,操作失败,因为条件被转换为field=null
,而不是field is null
我将RilevanzaFinding
对象映射为Finding
的组件:
HasMany<RilevanzaFinding>(x => x.Rilevanze)
.Access.CamelCaseField(Prefix.Underscore)
.Table("RilevanzaFinding_T045")
.KeyColumn("int_T045_IdFinding")
.Cascade.AllDeleteOrphan()
.AsSet()
.Component(fee =>
{
fee.References<Rating>(x => x.Rating).Column("int_T045_IdRating").Fetch.Join();
fee.Map(x => x.DataFine)
.Column("dte_T045_DataFine")
.CustomSqlType("Date");
fee.Map(x => x.Note)
.Column("nvc_T045_Note")
.Length(100000);
});
public class Finding : BaseObject<Finding, int>
{
private ICollection<RilevanzaFinding> _rilevanze = new List<RilevanzaFinding>();
public virtual IEnumerable<RilevanzaFinding> Rilevanze
{
get
{
return _rilevanze.ToArray();
}
}
}
public class RilevanzaFinding : EquatableObject<RilevanzaFinding>
{
public virtual Rating Rating { get; set; }
public virtual DateTime? DataFine{ get; set; }
public virtual string Note { get; set; }
}
由于出现“dte\U T045\U DataFine=NULL”的情况,wich将失败,因为这将是“dte\U T045\U DataFine为NULL”
如何使其写入正确的条件?您不能使用
集和NHibernate v5.1或以前的版本
发件人:
请注意,复合元素映射不支持null-able
属性,如果您使用的是
。NHibernate必须使用每个列
值,用于在删除对象时标识记录(没有单独的
组合元素表中的主键列),该列不是
可能是空值。您必须使用only或notnull
属性,或选择一个
、
、
或
在我看来,在这种情况下,最好映射实体而不是组件,并向表中添加主键。顺便说一下,SQL的性能会更好
从NHibernate v4.1开始,为过滤查询添加了空相等语义支持。但删除案例仍然不受支持
从NHibernate v5.2(应在2018年第3季度提供)开始,删除案例现在也支持它()
因此,另一个解决方案是升级到NHibernate v5.2。如果将条件从=null转换为IS null,则可以解决文档中的一个常见NHibernate限制,如where条件中所做的。现在,切换为空值的默认日期,所以我在表中始终有一个值,这将是一个语义更改。对于SQL,null不等于null,一致性基础(不是SQL Server)甚至允许对具有相同列值的行使用唯一索引,前提是所有这些行中有一个索引列为null。因此,具有“相同”值但其中一些值为空的两个组件不被视为相同。这就是为什么NHibernate无法确定当集合中的某个组件具有null属性时应删除该组件的原因。即使使用null,也将遵守密钥:只能存在一行null:null-1-1和1-1-1不同,不允许使用两行null-1-1。如上所述,简单的技巧是在搜索指定行时将=null转换为is null,每次“不允许两个null-1-1行”:由您或您的db执行,可能正如我在前面的评论中所解释的那样。但从SQL标准开始,它是允许的。您看到了吗?至少在某些情况下,为了接受组件属性的null
相等性,似乎已经做了一些更改,从v4.1开始就是这样。你的版本旧吗?如果没有,你仍然可以报告你的情况,看看它是否被接受。
NHibernate: DELETE FROM RilevanzaFinding_T045 WHERE int_T045_IdFinding =
@p0 AND dte_T045_DataFine = @p1 AND nvc_T045_Note = @p2 AND int_T045_IdRating
= @p3;@p0 = 201 [Type: Int32 (0:0:0)], @p1 = NULL [Type: DateTime (0:0:0)], @p2 = 'GD675PFN2GTR9EUJ3JHPG7XFX' [Type: String (1073741823:0:0)],
@p3 = 243 [Type: Int32 (0:0:0)]