NHibernate CreateSqlQuery和对象图

时间:2010-01-22 14:48:20

标签: nhibernate

您好我是NHibernate的新手。我想使用连接到我的三个表来对数据库进行一次SQL查询。

我的应用程序包含许多用户的许多角色。我正在尝试让NHibernate从Application对象开始正确地形成对象图。例如,如果我有10个应用程序记录,我想要10个应用程序对象,然后这些对象具有其用户的角色。然而,我得到的东西类似于笛卡尔积,其中我有尽可能多的应用程序对象作为总用户记录。

我已经对此进行了相当多的研究,并且不确定是否可以正确地构建应用程序层次结构。我只能让扁平的物体回来。似乎“也许”可能,因为在我的研究中我已经阅读了关于“分组连接”和“分层输出”以及即将发布的LINQ到NHibernate版本。虽然我是一个新手。

[更新基于Frans在Ayende的帖子中的评论我在猜测我想做什么是不可能http://ayende.com/Blog/archive/2008/12/01/solving-the-select-n1-problem.aspx]

先谢谢你的时间。

Session.CreateSQLQuery(@"SELECT a.ID,
                a.InternalName,
                r.ID,
                r.ApplicationID,
                r.Name,
                u.UserID,
                u.RoleID
              FROM dbo.[Application] a  JOIN dbo.[Roles] r ON a.ID = r.ApplicationID
                 JOIN dbo.[UserRoleXRef] u ON u.RoleID = r.ID")
                .AddEntity("app", typeof(RightsBasedSecurityApplication))
                .AddJoin("role", "app.Roles")
                .AddJoin("user", "role.RightsUsers")
                .List<RightsBasedSecurityApplication>().AsQueryable();

1 个答案:

答案 0 :(得分:1)

我刚刚发现了批处理。这应该足够好了,虽然使用连接会更好。

return Session
            .CreateCriteria<RightsBasedSecurityApplication>()
            .SetFetchMode("Roles", FetchMode.Select)
            .List<RightsBasedSecurityApplication>().AsQueryable();

public class RightsBasedSecurityApplicationMapping: ClassMap<RightsBasedSecurityApplication>
{
    public RightsBasedSecurityApplicationMapping()
    {
        Table("Application");
        Id(x => x.ID, "ID");//.Column("ID");
        Map(x => x.InternalName);
        HasMany(x => x.Roles).BatchSize(10);

public class RoleMapping : ClassMap<Role>
{
    public RoleMapping()
    {
        Table("Roles");
        Id(x => x.ID, "ID");
        References(x => x.Application, "ApplicationID").Not.LazyLoad();
        Map(x => x.Name);
        HasMany(x => x.RightsUsers).Table("UserRoleXRef").BatchSize(100);