Asp.net NHibernate关系

Asp.net NHibernate关系,asp.net,nhibernate,fluent-nhibernate,Asp.net,Nhibernate,Fluent 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() { User

我与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");
}
公共类用户
{
公共用户()
{
公共虚拟整数Id{get;set;}
公共虚拟IList用户确认{get;set;}
公共虚拟字符串电子邮件;
}
公共用户()
{
UserConfirmation=新列表();
}
}
公共类用户确认
{
公共虚拟整数Id{get;set;}
公共虚拟用户{get;set;}
}
公共类UserMap:ClassMap
{
公共用户映射()
{
Id(x=>x.Id);
Map(x=>x.Email);
HasMany(x=>x.UserConfirmation)
.Inverse()
.Cascade.All();
表(“用户”);
}
}

public类UserConfirmationMap:ClassMap
{
公共用户确认映射()
{
Id(x=>x.Id);
参考文献(x=>x.User);
表(“用户确认”);
}
}
但当我试着这样询问时:

QueryOver<UserConfirmation>().Where(x => x.User.Email).Take(1).SingleOrDefault()
QueryOver().Where(x=>x.User.Email).Take(1.SingleOrDefault())
它说我没有User.Email属性


我怎样才能解决这个问题?

我想你想要这样的东西

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

x应该已经是用户了。如果不是,我会用intellisense来看看它认为是什么类型。

我想你想要这样的东西

QueryOver<User>().Where(x => x.Email).Take(1).SingleOrDefault()
QueryOver().Where(x=>x.Email).Take(1.SingleOrDefault())
x应该已经是用户了。如果不是,我将使用intellisense查看它认为是什么类型。

尝试:

IQueryOver<UserConfirmation,User> qo = _Session.QueryOver<UserConfirmation,User>().Where(x => x.User.Email).Take(1).SingleOrDefault();
IQueryOver qo=\u Session.QueryOver().Where(x=>x.User.Email).Take(1.SingleOrDefault();
尝试执行以下操作:

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

问题是您正在使用x=>x.User.Email 这应该使用另一个别名来完成,该别名是user

UserConfirmation userConfirmationAlias;
User userAlias;


    QueryOver<UserConfirmation>(() => userConfirmationAlias)
    .joinAlias(() => userConfirmationAlias.User , () => userAlias)
    .Where(() => userAlias.Email).Take(1).SingleOrDefault()
userconfirmationuserconfirmationias;
用户别名;
查询版本(()=>userConfirmationAlias)
.joinAlias(()=>userConfirmationAlias.User,()=>userAlias)
.Where(()=>userAlias.Email).Take(1).SingleOrDefault()

像上面这样的方法应该可以解决问题,问题是你正在使用x=>x.User.Email 这应该使用另一个别名来完成,该别名是user

UserConfirmation userConfirmationAlias;
User userAlias;


    QueryOver<UserConfirmation>(() => userConfirmationAlias)
    .joinAlias(() => userConfirmationAlias.User , () => userAlias)
    .Where(() => userAlias.Email).Take(1).SingleOrDefault()
userconfirmationuserconfirmationias;
用户别名;
查询版本(()=>userConfirmationAlias)
.joinAlias(()=>userConfirmationAlias.User,()=>userAlias)
.Where(()=>userAlias.Email).Take(1).SingleOrDefault()

类似于上面的操作应该可以做到这一点

您可以使用LINQ而不是QueryOver:

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

顺便说一句,
.Take(1)。可能不需要SingleOrDefault()
。如果
电子邮件
是唯一的,
.SingleOrDefault()
就足够了。否则,您可以使用
.FirstOrDefault()

您可以使用LINQ而不是QueryOver:

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

顺便说一句,
.Take(1)。可能不需要SingleOrDefault()
。如果
电子邮件
是唯一的,
.SingleOrDefault()
就足够了。否则,您可以使用
.FirstOrDefault()

我不这样认为,因为问题是关于找不到属性User.Email。Visual Studio认为“x”在查询中是什么类型的()我不这样认为,因为问题是关于找不到属性User.Email。Visual Studio认为“x”在查询中是什么类型的()佩弗特!我只是修改为:QueryOver().JoinQueryOver(x=>x.User).Take(1.SingleOrDefault();佩弗特!我只是修改为:QueryOver().JoinQueryOver(x=>x.User).Take(1.SingleOrDefault();