2012-10-17 22 views
12

NHibenate ile ilgili bir sorunum var. Sorguyu çalıştırdığımda, "özniteliğini çözemedim" hata mesajı alıyorum: User.Name: MegaOnlineChat.Core.Entities.Message ".Ne yapmam yanlış?nhibernate, özellikleri çözemedi

varlık

public class EntityObject<TId> 
    { 
     public virtual Int32 Id { get; set; } 
    } 
public class User:EntityObject<Int32> 
    { 
     public virtual String Name { get; set; } 
     public virtual String Password { get; set; } 
     public virtual Boolean Admin { get; set; } 
     public virtual IList<Message> Messages { get; set; } 
    } 
public class Message:EntityObject<Int32> 
    { 
     public virtual String Text { get; set; } 
     public virtual User User { get; set; } 
     public virtual DateTime Date{ get; set; } 
    } 

haritalama

public class UserMapping:ClassMap<User> 
{ 
    public UserMapping() 
    { 
     Table("Users"); 
     Id(m => m.Id).GeneratedBy.Native(); 
     Map(m => m.Name).Unique().Not.Nullable(); 
     Map(m => m.Admin).Not.Nullable(); 
     Map(m => m.Password).Not.Nullable(); 

     HasMany(m => m.Messages).KeyColumn("User_id"); 
    } 
} 
public class MessageMapping:ClassMap<Message> 
{ 
    public MessageMapping() 
    { 
     Table("Messages"); 

     Id(m => m.Id).GeneratedBy.Native(); 

     Map(m => m.Text).Not.Nullable(); 
     Map(m => m.Date).Not.Nullable(); 

     References(m => m.User, "User_id").Not.Nullable(); 
    } 
} 

QueryOver

NHibernateSession.QueryOver<Message>().Where(x => x.User.Name == name).List<Message>().Last(); 

cevap

17

QueryOver Linq sorgu sağlayıcı aynı değildir nesneleri. Yapması kolay olurdu:

NHibernateSession.Query<Message>().Where(x => x.User.Name == name).ToList(); 

Ama QueryOver kullanmak istiyorsanız, açıkça Gitmek istediğiniz ilişkileri katılmak gerekir: Ayrıca bir takma ad kullanarak bu yapabilirdi

NHibernateSession.QueryOver<Message>() 
    .JoinQueryOver(x => x.User) // navigate to the user on the relationship 
    .Where(u => u.Name == name) // this restriction is on the User now 
    .List(); 

kullanıcı için

+0

Eğer 'Message' ek' .Where() 'maddelerini yapmak istiyorsanız bunu yapmanın bir yolu var mı? –

+0

Linq sağlayıcısını kullanıyorsanız, şu gibi bir şey yapabilirsiniz: session.Query () .Where (x => ...). Nerede (x => ..) vb. QueryOver'ı kullanıyorsanız, sorguyu düzenlerken 1 bağlaçına (AND) girdiğinizde, .and (..) yöntemini kullanarak –

+0

Ah, bunu çözdüm. [.JoinAlias] 'ı arıyordum (http://stackoverflow.com/questions/21322363/nhibernate-cannot-resolve-property-of-one-to-one-mapping-when-used-in-a-filter/21323504 # 21323504) –