NHibernate LINQ和多对多映射

时间:2012-07-18 07:50:53

标签: linq nhibernate fluent-nhibernate fluent-nhibernate-mapping

我将此条款映射到NHibernate 3.2上,并使用FluentNHibernate 1.3:

public class ClassA
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassB> ClassesB { get; }
    public ICollection<ClassC> ClassesC { get; }
}

public class ClassB
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassA> ClassesA { get; }
    public ICollection<ClassC> ClassesC { get; }
}

public class ClassC
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassA> ClassesA { get; }
    public ICollection<ClassB> ClassesB { get; }
}

所有映射都可以正常工作。但我需要使用LINQ进行查询,例如返回给定ClassB或ClassA实例中的所有ClassC实例,反之亦然。我需要在获取ClassC列表之前不加载任何ClassB或ClassA实例,只需使用实例的ID进行查询。

我知道我可以加载,例如,一个ClassB实例,然后获取ClassesC集合,但是我的应用程序设计我必须这样做而不这样做,我将使用它来做网格上的分页,以及其他操作与分页不同。

在纯SQL上,我可以通过简单的连接查询来实现,但我不知道如何使用LINQ。我不想要HQL或ICriteria的选项,它必须使用LINQ(Extensions更好),因为应用程序使用的插件必须没有NHibernate存在的意识。该插件接收一个IQueryable实例来进行查询(这允许我们轻松地将核心应用程序移植到其他数据库模式,如NoSQL或其他东西,甚至不重新编译插件或应用程序的其他部分。)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

默认情况下,FluentNHibernate中的HasMany将加载lazy集合。您可以使用流畅的语法配置它。

延迟加载示例:

class ClassAMap : ClassMap<ClassA>
{
    public ClassAMap()
    {
    // ...
    // lazy loading using select
    HasMany(x => x.ClassesB)
        .LazyLoad()
        .Fetch.Select()
    // ...
}

或使用join贪心加载:

class ClassAMap : ClassMap<ClassA>
{
    public ClassAMap()
    {
    // ...
    // greedy loading using join
    HasMany(x => x.ClassesB)
        .Fetch.Join()
    // ...
}

conventions

Table.Is(x => x.EntityType.Name + "Table")
    DefaultLazy.Always()

无论如何,这个配置主题非常复杂,取决于您如何配置映射。 我建议您使用log4net查看hHibernate SQL日志,以查看ORM生成的SQL命令