【问题标题】:NHibernate - Query with value object containing NULL valuesNHibernate - 使用包含 NULL 值的值对象进行查询
【发布时间】:2016-06-16 10:26:35
【问题描述】:

我有一个像这样的值对象:

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);
    }
}

我这样创建一个查询:

var owner = new Person("Anneliese", "ObjectOfficer_1");
var query = NhSession.Query<ServiceContract>()
                .Where(s => s.ObjectOfficer.Manager == owner);
contracts = query.ToList();

这将创建一个 Person 的实例,该实例具有 null MiddleName 和 Nickname。 NHibernate 会像这样创建一个查询:

select .....
from .....
where (objectoffi1_.FirstName = @p0 
      and objectoffi1_.LastName = @p1 
      and objectoffi1_.MiddleName = @p2 
      and objectoffi1_.NickName = @p3);
  @p0 = 'Anneliese' [Type: String (4000)], 
  @p1 = 'ObjectOfficer_1' [Type: String (4000)], 
  @p2 = NULL [Type: String (4000)], 
  @p3 = NULL [Type: String (4000)]

没有记录匹配是错误的。

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

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

它返回正确数量的结果。有谁知道如何处理这个?如果 NHibernate 将 field = NULL 而不是 field is null 发送到 MS SQL Server,则不会返回任何结果,因为它是 错误的 TSQL。有什么想法吗?

【问题讨论】:

  • 您使用的是什么 nhibernate 版本以及什么 mssqldialect?
  • 最新版本,NH 4.0.4.4000,FNH 2.0.3,SQL Dialect 2012,SQL Server 2014 是我使用的,但 2012 是 NH 支持的最新版本。

标签: nhibernate


【解决方案1】:

事实证明,不可能将具有可为空属性的值对象放在 where 子句中。您必须自己在代码中关心这些潜在的空值。一旦您直接逐个字段比较字段,它就可以工作。这里是“正确”版本:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多