我有两个最简单的实体,类似于:
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();
我正在流利地使用来映射实体。
所以。。。。我该如何对guid应用限制?
相关实体的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)
注意:这是未经测试的,所以有任何问题请告诉我。
您还可以比较实体:
var user = session.Load<User>(userGuid);
...
.Where(r => r.User == user)