一对一Nhibernate调用多个SQL语句

本文关键字:SQL 语句 Nhibernate 调用 一对一 | 更新日期: 2023-09-27 18:30:08

我有一个一对一循环引用的类,假设它们看起来像这样。

public class Foo
{
    public Bar Bar { get; set; }
    /* Some irrelevant code */
}

public class Bar
{
    public Foo Foo { get; set; }
    /* Some irrelevant code */
}

和一个流畅的nhibernate地图

BarMap
{
    Table("Bars");
    // Some mappings
    Reference(x => x.Foo).Column("FooId");
}
FooMap
{
    Table("Foos");
    // Some Mappings
    HasOne(x => x.Bar).PropertyRef(x => x.Foo).Not.Lazy.Cascade.SaveUpdates();
}

我意识到你不能懒洋洋地在nhibernate中加载一对一关系,所以我想做的是选择所有Bars,并在我想要Foo的东西时将其加入Foo。我想我需要获取Bar,但当我执行时:

var foos = session.Query<Foo>().Where(/*Some boolean logic*/).Fetch(x => x.Bar).ToList();

然后Nhibinates执行多个SQL语句,为每个Foo选择一个Bar。我只想选择两次。Foo一次,Bar一次——因为这不能懒惰加载。我怎样才能做到这一点?

一对一Nhibernate调用多个SQL语句

您可能可以使用期货来实现您想要的目标。例如:

session.Query<Bar>().Fetch(x => x.Foo).ToFuture();
var foos = session.Query<Foo>().Where(/*Some boolean logic*/).Fetch(x => x.Bar).ToList();

其思想是,在第一个查询上使用ToFuture()将确保两个查询同时运行,nhibernate可以使用第一个查询的结果来帮助填充第二个查询。您可能需要处理实际的查询,以使事情按您期望的方式进行。

我的问题是IBar对另一个对象有另一个循环引用,比如Baz:

BarMap
{
    Table("Bars");
    Reference(x => x.Foo).Column("FooId");
    HasOne(x => x.Bar).PropertyRef(x => x.Bar).Not.Lazy.Cascade.SaveUpdates();
}
BazMap
{
    Table("Baz");
    Reference(x => x.Foo).Column("BarId");
}

所以我加入Foo、Bar和Baz解决了这个问题。

var Foos = session
    .Query<Foo>()
    .Fetch(x => x.Bar)
    .ThenFetch(x => x.Baz)
    .ToList();

考虑到我真的只需要Foos表中的几个字段,这有点过头了。