2012-04-04 3 views
0

Я работаю с NHibernate и я получаю этот код ниже:NHibernate Отношения

public class User 
{ 
    public User() 
    { 
    public virtual int Id { get; set; } 
    public virtual IList<UserConfirmation> UserConfirmation { get; set; } 
    public virtual string Email; 
    } 

    public User() 
    { 
    UserConfirmation = new List<UserConfirmation>(); 
    } 
} 

public class UserConfirmation 
{ 
    public virtual int Id { get; set; } 
    public virtual User { get; set; } 
} 

public class UserMap :  ClassMap<User> 
{ 
    public UserMap()   
    { 
    Id(x => x.Id);    
    Map(x => x.Email);   
    HasMany(x => x.UserConfirmation) 
    .Inverse() 
    .Cascade.All(); 
    Table("user"); 
} 

}

Но когда я пытаюсь запросить через так:

QueryOver<UserConfirmation>().Where(x => x.User.Email).Take(1).SingleOrDefault() 

Чем он говорит, что у меня нет свойства User.Email.

Как я могу решить эту проблему?

ответ

2

Проблема вы используете х => x.User.Email это должно быть сделано с другим псевдонимом, который был бы пользователь

UserConfirmation userConfirmationAlias; 
User userAlias; 


    QueryOver<UserConfirmation>(() => userConfirmationAlias) 
    .joinAlias(() => userConfirmationAlias.User ,() => userAlias) 
    .Where(() => userAlias.Email).Take(1).SingleOrDefault() 

что-то вроде выше должен сделать трюк

+0

Peferct! Я просто изменить, чтобы: QueryOver () .JoinQueryOver (х => x.User) .Снять (1) .SingleOrDefault(); –

1

Я думаю, вы хотите что-то подобное.

QueryOver<User>().Where(x => x.Email).Take(1).SingleOrDefault() 

x должен быть пользователем уже. Если это не я, я бы использовал intellisense, чтобы посмотреть, какой тип он считает.

+1

Я так не думаю, что проблема заключается не в том, чтобы найти свойство User.Email. –

+0

Какой тип Visual Studio считает, что «x» находится в QueryOver () – Zipper

1

Попробуйте сделать:

IQueryOver<UserConfirmation,User> qo = _Session.QueryOver<UserConfirmation,User>().Where(x => x.User.Email).Take(1).SingleOrDefault(); 
1

Вы можете использовать LINQ вместо QueryOver:

Query<UserConfirmation>().Where(x => x.User.Email).Take(1).SingleOrDefault() 

BTW, .Take(1).SingleOrDefault(), вероятно, не требуется. Если Email является уникальным, .SingleOrDefault() будет достаточно. В противном случае вы можете использовать .FirstOrDefault()