2012-03-06 4 views
0

У меня есть две простые из лиц, аналогично:Guid ограничения в NHibernate 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, я хочу выбрать все 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(); 

Я использую свободно для отображения объектов.

Итак, как я могу применить ограничения на контуры, пожалуйста?

ответ

1

Идентификатор связанного объекта рассматривается как 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) 

Примечание: Это не тестировалась, поэтому любые проблемы, дайте мне K Теперь.

+0

Отлично! Теперь я не только знаю, что мне нужно сделать, чтобы заставить его работать, но я также знаю, почему он не работает! Спасибо. Я бы много раз это делал, если бы мог! – LocustHorde

0

Вы также можете сравнить объект:

var user = session.Load<User>(userGuid); 
... 
.Where(r => r.User == user) 
Смежные вопросы