我有两个最简单的实体,类似于:
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施加限制呢?
答案 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)