2012-03-06 50 views
0

我有两个简单的实体,类似于:的Guid限制

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 comparisions做..

我对GUID映射是这样的:(在用户映射类)

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

我用流利的实体映射。

那么....我该如何对GUID应用限制?

回答

1

相关实体的ID被视为special。多对一的外键总会得到保湿。这是因为NHibernate的使用懒加载的,所以这是完全有效的: - :

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

因此你会 -

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

然而,由于相关的实体需要之前的Guid被设置为水合这是无效的需要查询与Rentals加入User,沿着线的东西: -

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

注:这是未经测试,所以任何问题,让我ķ现在。

+0

好极了!现在,我不仅知道我需要做什么才能使其工作,但我也知道为什么它不工作!非常感谢。如果可以的话,我会多次赞扬它! – LocustHorde 2012-03-07 14:39:42

0

您还可以比较的实体:

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