NHibernate Criteria Queries - 如何在一对一关系中使用

发布于 2024-12-12 12:31:24 字数 3626 浏览 1 评论 0原文

我有简单的 3 个 POCO 类:

public class User
{
    //PK
    public virtual int UserId { get; set; }
    //ONE to ONE
    public virtual Profil Profil{ get; set; }
    //ONE to MANY
    public virtual IList<PhotoAlbum> Albums { get; set; }
}

public class Profil
{
    //PK
    public virtual int ProfilId { get; set; }

    public virtual int Age { get; set; }
    public virtual int Sex { get; set; }
}

public class PhotoAlbum
{
    //PK
    public virtual int PhotoAlbumId { get; set; }

    public virtual string Name { get; set; }
    public virtual int NumberOfPhoto { get; set; }
}

我创建了这些映射类:

public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            //PK
            Id(p => p.UserId)
               .GeneratedBy.Identity();
            //FK
            References(p => p.Profil)
                .Column("ProfilId")
                .Cascade.All(); 
            //ONE TO MANY
            HasMany(p => p.Albums)
                 .Cascade.All();

            Table("Users");
        }
    }

    public class ProfilMap: ClassMap<Profil>
    {
        public ProfilMap()
        {
            Id(p => p.ProfilId)
                .GeneratedBy.Identity();

            Map(p => p.Age)
                .Not.Nullable();
            Map(p => p.Sex)

            Table("Profiles");
        }
    }

    public class PhotoAlbumMap : ClassMap<PhotoAlbum>
    {
        public PhotoAlbumMap()
        {
            Id(p => p.PhotoAlbumId)
                .GeneratedBy.Identity();
            Map(p => p.Name)
                .Not.Nullable();
            Map(p => p.NumberOfPhoto)
                .Not.Nullable();
            Table("PhotoAlbums");
        }
    }

然后我用这个方法创建了简单的 NHibernate 存储库类:

    public IList<T> GetItemsByCriterions(params ICriterion[] criterions)
    {
        ICriteria criteria = AddCriterions(_session.CreateCriteria(typeof(T)),
            criterions);

        IList<T> result = criteria.List<T>();
        return result ?? new List<T>(0);
    }

为了测试,我为某些实体创建了存储库,例如用户:

_userRepo = new NHibRepository<User>(NHibeHelper.OpenSession());

并且我希望有可能以这种方式进行查询:

    var users = _userRepo.GetItemsByCriterions(new ICriterion[]
                                                   {
                                                       Restrictions.Gt("Profile.Age",10)
                                                   });

这个尝试完成时出现错误:

无法解析属性:配置文件:Repository.User

用户具有属性配置文件类型的配置文件,并且此属性具有属性 ProfileId、Age 和性。

** #1 已编辑:**

@ 我尝试了这个:

    var users = _userRepo.GetItemsByCriterions(new ICriterion[]
                                                   {
                                                       Restrictions.Where<User>(u=>u.Profil.Sex==0)
                                                   });

完成后出现错误:

无法解析属性:Profil.Sex of:Repository.User

#2 EDITED

我尝试使用内森的建议:

        var result = _userRepo.Session.CreateCriteria<User>()
            .CreateAlias("Profile", "profile", JoinType.InnerJoin)
            .Add(Restrictions.Eq("profile.Sex", 0));

        IList<User> users=null;
        if (result != null)
            users = result.List<User>();

如果我尝试将结果转换为列表,我再次收到此错误:无法解析属性:配置文件:Repository.User

I have simple 3 POCO classes:

public class User
{
    //PK
    public virtual int UserId { get; set; }
    //ONE to ONE
    public virtual Profil Profil{ get; set; }
    //ONE to MANY
    public virtual IList<PhotoAlbum> Albums { get; set; }
}

public class Profil
{
    //PK
    public virtual int ProfilId { get; set; }

    public virtual int Age { get; set; }
    public virtual int Sex { get; set; }
}

public class PhotoAlbum
{
    //PK
    public virtual int PhotoAlbumId { get; set; }

    public virtual string Name { get; set; }
    public virtual int NumberOfPhoto { get; set; }
}

I created these mapping classes:

public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            //PK
            Id(p => p.UserId)
               .GeneratedBy.Identity();
            //FK
            References(p => p.Profil)
                .Column("ProfilId")
                .Cascade.All(); 
            //ONE TO MANY
            HasMany(p => p.Albums)
                 .Cascade.All();

            Table("Users");
        }
    }

    public class ProfilMap: ClassMap<Profil>
    {
        public ProfilMap()
        {
            Id(p => p.ProfilId)
                .GeneratedBy.Identity();

            Map(p => p.Age)
                .Not.Nullable();
            Map(p => p.Sex)

            Table("Profiles");
        }
    }

    public class PhotoAlbumMap : ClassMap<PhotoAlbum>
    {
        public PhotoAlbumMap()
        {
            Id(p => p.PhotoAlbumId)
                .GeneratedBy.Identity();
            Map(p => p.Name)
                .Not.Nullable();
            Map(p => p.NumberOfPhoto)
                .Not.Nullable();
            Table("PhotoAlbums");
        }
    }

Then I created simple NHibernate repository class with this method:

    public IList<T> GetItemsByCriterions(params ICriterion[] criterions)
    {
        ICriteria criteria = AddCriterions(_session.CreateCriteria(typeof(T)),
            criterions);

        IList<T> result = criteria.List<T>();
        return result ?? new List<T>(0);
    }

For test I created repository for some entity, for example User:

_userRepo = new NHibRepository<User>(NHibeHelper.OpenSession());

and I would like have possibility make query in this style:

    var users = _userRepo.GetItemsByCriterions(new ICriterion[]
                                                   {
                                                       Restrictions.Gt("Profile.Age",10)
                                                   });

this attempt finished with error:

could not resolve property: Profile of: Repository.User

User has property Profile type of Profile and this property has properties ProfileId, Age
and sex.

** #1 EDITED:**

@ I tried this:

    var users = _userRepo.GetItemsByCriterions(new ICriterion[]
                                                   {
                                                       Restrictions.Where<User>(u=>u.Profil.Sex==0)
                                                   });

finished with error:

could not resolve property: Profil.Sex of: Repository.User

#2 EDITED

I tried use Nathan’s advice:

        var result = _userRepo.Session.CreateCriteria<User>()
            .CreateAlias("Profile", "profile", JoinType.InnerJoin)
            .Add(Restrictions.Eq("profile.Sex", 0));

        IList<User> users=null;
        if (result != null)
            users = result.List<User>();

If I tried convert result to List I again get this error: could not resolve property: Profile of: Repository.User

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

┼── 2024-12-19 12:31:24

查看您的示例,用户有一个配置文件属性而不是配置文件属性。

如果它应该是 Profil 那么我会将 Restrictions.Gt(Profile.Age,10) 更改为 Restrictions.Gt(Profil.Age,10) 否则更改属性的名称和映射以匹配查询。

编辑:
您正在尝试查询用户对象。你需要包含 CreateAlias 让 nhibernate 知道你想要链接到不同的对象。

试试这个。

var users = session.CreateCriteria<User>() 
  .CreateAlias("Profile", "profile", JoinType.InnerJoin) 
  .Add(Restrictions.Eq("profile.Age", 10)); 

Looking at your example, User has a Profil property not a Profile property.

If it is supposed to be Profil then I would change the Restrictions.Gt(Profile.Age,10) to Restrictions.Gt(Profil.Age,10) otherwise change the name of the property and mapping to match the query.

Edit:
You are trying to query the User Object. you need to include the CreateAlias let nhibernate know that you want to link to a different object.

Try This.

var users = session.CreateCriteria<User>() 
  .CreateAlias("Profile", "profile", JoinType.InnerJoin) 
  .Add(Restrictions.Eq("profile.Age", 10)); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文