NHibernate-具有包含空值的值对象的查询

NHibernate-具有包含空值的值对象的查询,nhibernate,Nhibernate,我有一个值对象,如下所示: public class PersonMapping : ComponentMap<Person> { public PersonMapping() { Map(x => x.FirstName).Not.Nullable().Length(96); Map(x => x.LastName).Not.Nullable().Length(96); Map(x => x.Midd

我有一个值对象,如下所示:

public class PersonMapping : ComponentMap<Person>
{
    public PersonMapping()
    {
        Map(x => x.FirstName).Not.Nullable().Length(96);
        Map(x => x.LastName).Not.Nullable().Length(96);
        Map(x => x.MiddleName).Nullable().Length(96);
        Map(x => x.NickName).Nullable().Length(64);
    }
}
没有错误的记录匹配。

当我更改生成的查询并用如下值替换参数时:

...
where (objectoffi1_.FirstName = 'Anneliese' and objectoffi1_.LastName = 'ObjectOfficer_1' 
and objectoffi1_.NickName is null and objectoffi1_.MiddleName is null)

它返回正确数量的结果。有人知道怎么处理这件事吗?如果NHibernate将字段=NULL改为字段为NULL发送到MS SQL Server,则不会返回任何结果,因为它错误的TSQL。有什么想法吗?

结果表明,在where子句中不可能放置具有可为空属性的值对象。您必须自己在代码中关心这些潜在的空值。一旦您直接逐字段比较字段,它就会起作用。以下是“正确”版本:

var query = NhSession.Query<ServiceContract>()
                .Where(s => s.ObjectOfficer.Manager.FirstName == owner.FirstName 
                            && s.ObjectOfficer.Manager.LastName == owner.LastName);
contracts = query.ToList();
var query=NhSession.query()
.Where(s=>s.ObjectOfficer.Manager.FirstName==owner.FirstName
&&s.ObjectOfficer.Manager.LastName==所有者.LastName);
contracts=query.ToList();

我认为这不仅仅是不方便,我不知道像EF这样的其他ORM是否也有同样的问题。值对象是DDD的一个重要组成部分。

您使用的是什么nhibernate版本和什么MSSQL方言?我使用的是最新版本,NH 4.0.4.4000、FNH 2.0.3、SQL方言2012、SQL Server 2014,但2012是NH支持的最新版本。
...
where (objectoffi1_.FirstName = 'Anneliese' and objectoffi1_.LastName = 'ObjectOfficer_1' 
and objectoffi1_.NickName is null and objectoffi1_.MiddleName is null)
var query = NhSession.Query<ServiceContract>()
                .Where(s => s.ObjectOfficer.Manager.FirstName == owner.FirstName 
                            && s.ObjectOfficer.Manager.LastName == owner.LastName);
contracts = query.ToList();