Nhibernate Queryover中的Guid限制

时间:2012-03-06 17:00:31

标签: nhibernate guid queryover

我有两个最简单的实体,类似于:

public class User
{
    int id;
    string name;
    Guid Guid;
    IList<Rentals> Rentals;
}

public class Rentals
{
    int Id { get; protected set; }
    User User { get; set; }
    int DvdId { get; set; }
}    

(我声明了所有公共虚拟属性以及所有内容,这里不再提及它来简化)

假设每个User会有很多Rentals,我想通过他的Guid选择某个用户的所有DvdId

我遇到了一个例外,这个例外:could not resolve property: User.Guid

这就是我在我的存储库中所做的事情:

DetachedCriteria dc = QueryOver.Of<Rentals>()
    .Where(r => r.User.Guid == userGuid)
    .Select(r => r.DvdId)
    .DetachedCriteria;

从单元测试中传递userGuid的位置。 (这是我所知道的那个)

如果我改为:

DetachedCriteria dc = QueryOver.Of<Rentals>()
    .Where(r => r.User.Id == 1) // Note - replaced guid with id (an int)
    .Select(r => r.DvdId)
    .DetachedCriteria;

这很好用。所以我猜测需要为guid比较做些什么..

我对guid的映射是这样的:(在UserMap类下)

Map(x => x.Guid, "Guid")
    .Not.Nullable();

我正在流利地使用它来映射实体。

那么......我如何对guids施加限制呢?

2 个答案:

答案 0 :(得分:1)

相关实体的ID被视为special。多对一的外键始终保持水分。这是因为NHibernate使用延迟加载,所以这是完全有效的: -

 .Where(r => r.User.Id == 1)

然而,这是无效的,因为在设定Guid之前,相关实体需要保湿: -

.Where(r => r.User.Guid == userGuid) 

因此,您需要在查询中加入User Rentals,其中包括: -

 .QueryOver.Of<Rentals>()
 .JoinQueryOver<User>(x => x.User)
 .Where(x => x.Guid == userGuid)

注意:这是未经测试的,所以任何问题都让我知道。

答案 1 :(得分:0)

您还可以比较实体:

var user = session.Load<User>(userGuid);
...
.Where(r => r.User == user)