NHibernate命名查询,每个子类有表

NHibernate命名查询,每个子类有表,nhibernate,named-query,table-per-subclass,Nhibernate,Named Query,Table Per Subclass,我有一个项目,我们只使用命名查询访问数据库。最近,我们创建了新的实体,我们计划按照每个子类的表模式映射这些实体,因此我们按照文档创建了映射,一切似乎都很好,只是我们找不到如何在命名查询中定义表别名以加载每个子类 这就是我们迄今为止所做的: 实体: public class Gear { public virtual string Name { get; set; } public virtual string Slug { get; set; } } public clas

我有一个项目,我们只使用命名查询访问数据库。最近,我们创建了新的实体,我们计划按照每个子类的表模式映射这些实体,因此我们按照文档创建了映射,一切似乎都很好,只是我们找不到如何在命名查询中定义表别名以加载每个子类

这就是我们迄今为止所做的:

实体:

public class Gear 
{
    public virtual string Name { get; set; }

    public virtual string Slug { get; set; }
}

public class Pedal : Gear
{
    public virtual PedalTypeEnum PedalType { get; set; }
}
public class GearMap : ClassMap<Gear>
{
    public GearMap()
    {
        Table("[Gear]");

        Id(m => m.Id).Column("Id");
        Map(m => m.Name).Column("[Name]");
        Map(m => m.Slug).Column("[Slug]");
    }
}


public class PedalMap : SubclassMap<Pedal>
{

    public PedalMap() 
    {

        Table("[Pedal]");
        KeyColumn("[Gear_Id]");

        Map(m => m.PedalType).Column("PedalType").CustomType(typeof(PedalTypeEnum));


    }
}
映射:

public class Gear 
{
    public virtual string Name { get; set; }

    public virtual string Slug { get; set; }
}

public class Pedal : Gear
{
    public virtual PedalTypeEnum PedalType { get; set; }
}
public class GearMap : ClassMap<Gear>
{
    public GearMap()
    {
        Table("[Gear]");

        Id(m => m.Id).Column("Id");
        Map(m => m.Name).Column("[Name]");
        Map(m => m.Slug).Column("[Slug]");
    }
}


public class PedalMap : SubclassMap<Pedal>
{

    public PedalMap() 
    {

        Table("[Pedal]");
        KeyColumn("[Gear_Id]");

        Map(m => m.PedalType).Column("PedalType").CustomType(typeof(PedalTypeEnum));


    }
}
正如您所见,它正确地检测子类,并尝试加载仅属于该子类的字段PedalType,但由于没有别名为
[Gear]\u1的表。
查询失败

我们已尝试使用踏板表进行连接,但无法找到正确的方法来设置别名,使其转换为
[Gear]\u1.

有什么帮助吗?

这对我很有用:

<sql-query name="myquery" >
  <return alias="Gear" class="Gear" />
  SELECT {Gear.*}
  FROM Gear {Gear}
  LEFT JOIN Pedal Gear_1_ on Gear.Id = Gear_1_.Gear_Id
</sql-query>

选择{Gear.*}
从齿轮{Gear}
左连接踏板档位1档位上的档位Id=档位1档位Id
当然,您可以使用HQL而不是SQL:

<query name="myhqlquery">
  from Gear
</query>

从齿轮
然而。。。我必须说,这是一个非常低效的使用NHibernate。您正在非常努力地与框架抗争,而不是利用其灵活性。

这对我来说很有效:

<sql-query name="myquery" >
  <return alias="Gear" class="Gear" />
  SELECT {Gear.*}
  FROM Gear {Gear}
  LEFT JOIN Pedal Gear_1_ on Gear.Id = Gear_1_.Gear_Id
</sql-query>

选择{Gear.*}
从齿轮{Gear}
左连接踏板档位1档位上的档位Id=档位1档位Id
当然,您可以使用HQL而不是SQL:

<query name="myhqlquery">
  from Gear
</query>

从齿轮

然而。。。我必须说,这是一个非常低效的使用NHibernate。您正在与框架进行激烈的斗争,而不是利用其灵活性。

您使用SQL而不是HQL有什么原因吗?您使用SQL而不是HQL有什么原因吗?对不起,您能解释一下为什么这不利于框架吗?我之所以使用SQL,是因为它似乎是调整SQL查询以获得最大性能的最佳方法,同时保留了框架的所有灵活性:)在需要时手工编写SQL是绝对好的。但对每个查询强制这样做是浪费时间。而且,在这样的情况下,你需要付出大量的努力来实现一些与所有其他方法一起开箱即用的东西(在许多情况下,它可能会崩溃)。换句话说,你会在这里优化什么?您的实际分析是否表明这些优化是必要的?使用ORM背后的想法正是,不必手工编写SQL,同时利用ORM提供的更改跟踪、身份映射和其他功能。SQL查询功能是为了灵活性而提供的,因为有时您的查询不容易用HQL、LINQ或条件表达。但大多数时候,其他方法更容易编码和维护。好吧,任何适合你的方法。但特别是对于多态查询,从长远来看,破解NH的内部约定可能不是最好的主意。我通常会把这些问题转过来。你有没有想过,也许你是世界上唯一一个想这么做的人?我并不是说您的架构是无效的,但完全有可能,因为没有其他人使用它,所以没有人花时间编写NHibernate代码来支持它。这就是开源的好处:你可以获得NH源代码,创建一个新的注入宏,扩展到完整的联接子类语句,并将其贡献给社区。对不起,你能解释一下为什么这不符合框架吗?我之所以使用SQL,是因为它似乎是调整SQL查询以获得最大性能的最佳方法,同时保留了框架的所有灵活性:)在需要时手工编写SQL是绝对好的。但对每个查询强制这样做是浪费时间。而且,在这样的情况下,你需要付出大量的努力来实现一些与所有其他方法一起开箱即用的东西(在许多情况下,它可能会崩溃)。换句话说,你会在这里优化什么?您的实际分析是否表明这些优化是必要的?使用ORM背后的想法正是,不必手工编写SQL,同时利用ORM提供的更改跟踪、身份映射和其他功能。SQL查询功能是为了灵活性而提供的,因为有时您的查询不容易用HQL、LINQ或条件表达。但大多数时候,其他方法更容易编码和维护。好吧,任何适合你的方法。但特别是对于多态查询,从长远来看,破解NH的内部约定可能不是最好的主意。我通常会把这些问题转过来。你有没有想过,也许你是世界上唯一一个想这么做的人?我并不是说您的架构是无效的,但完全有可能,因为没有其他人使用它,所以没有人花时间编写NHibernate代码来支持它。这就是开源的好处:您可以获得NH源代码,创建一个新的注入宏,扩展到完整的联接子类语句,并将其贡献给社区。