2012-03-06 18 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)