C# Nhibernate无法删除具有null属性值的值对象

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遇到了这样的问题:

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)]