代码之家  ›  专栏  ›  技术社区  ›  kitsune

如何在nhibernate中查询持久化对象的属性的子属性?

  •  1
  • kitsune  · 技术社区  · 17 年前

    我觉得很傻。

    public class Uber
    {
       public Foo Foo { get; set; }
       public Bar Bar { get; set; }
    }
    
    public class Foo
    {
       public string Name { get; set; }
    }
    
    ...
    
    var ubercharged = session.CreateCriteria(typeof(Uber))
    .Add(Expression.Eq("Foo.Name", "somename"))
    .UniqueResult<Uber>();
    return ubercharged;
    

    这将引发“无法解析属性”错误。

    我做错什么了?我想查询一个具有属性foo的uber对象,该属性的名称为“somename”。

    使用Fluent nhibernate更新了现实生活中的示例,存储库调用:

        public UserPersonalization GetUserPersonalization(string username)
        {
            ISession session = _sessionSource.GetSession();
    
            var personuser = session.CreateCriteria(typeof(UserPersonalization))
                .Add(Expression.Eq("User.Username", username))
                .UniqueResult<UserPersonalization>();
            return personuser;
    
        }
    

    类/映射:

    public class User
    {
        public virtual Guid UserId { get; set; }
        public virtual string Username { get; set; }
        public virtual string Email { get; set; }
        public virtual string PasswordHash { get; set; }
        public virtual string PasswordSalt { get; set; }
        public virtual bool IsLockedOut { get; set; }
        public virtual bool IsApproved { get; set; }
    
    }
    
    public class Person
    {
        public virtual int PersonId { get; set; }
        public virtual string Name { get; set; }
        public virtual Company Company { get; set; }
    
    }
    
    public class UserPersonalization
    {
        public virtual int UserPersonalizationId { get; set; }
        public virtual Person Person { get; set; }
        public virtual User User { get; set; }
    }
    
    public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Id(x => x.UserId).GeneratedBy.Guid().ColumnName("UserId");
            Map(x => x.Username);
            Map(x => x.PasswordHash);
            Map(x => x.PasswordSalt);
            Map(x => x.Email);
            Map(x => x.IsApproved);
            Map(x => x.IsLockedOut);
        }
    }
    
    public class UserPersonalizationMap : ClassMap<UserPersonalization>
    {
        public UserPersonalizationMap()
        {
            WithTable("UserPersonalization");
            Id(x => x.UserPersonalizationId).ColumnName("UserPersonalizationId");
            References(x => x.Person).ColumnName("PersonId");
            References(x => x.User).ColumnName("UserId");
        }
    }
    
    public class PersonMap : ClassMap<Person>
    {
        public PersonMap()
        {
            Id(x => x.PersonId).ColumnName("PersonId");
            Map(x => x.Name);
            References(x => x.Company).ColumnName("CompanyId");
        }
    }
    
    2 回复  |  直到 17 年前
        1
  •  5
  •   Stuart Childs    17 年前

    试试这个:

    var ubercharged = session.CreateCriteria(typeof(Uber))
            .CreateCriteria("Foo")
                .Add(Restrictions.Eq("Name", "somename"))
                .UniqueResult<Uber>();
    
        2
  •  1
  •   Chad Ruppert    17 年前

    可以使用“ubercharged.addorder(order.asc(“foo.name”))语法进行排序吗?这个语法应该在nhib 2.01中工作。如果没有,则说明您的地图工作不正常。

    斯图亚特的回答对你来说应该很好。

    推荐文章