【问题标题】:One-To-One Nhibernate invokes multiple SQL statements一对一的 Nhibernate 调用多个 SQL 语句
【发布时间】:2014-11-11 13:52:43
【问题描述】:

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

public class Foo
{
    public Bar Bar { get; set; }

    /* Some irrelevant code */
}

public class Bar
{
    public Foo Foo { get; set; }

    /* Some irrelevant code */
}

和流畅的休眠地图

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();

Nhibernates 然后执行多个 SQL 语句,为每个 Foo 选择一个 Bar。我只想选择两次。一次用于 Foo,一次用于 Bar - 因为这不能延迟加载。我怎样才能做到这一点?

【问题讨论】:

    标签: c# sql nhibernate fluent-nhibernate one-to-one


    【解决方案1】:

    您也许可以使用期货来完成您想要的。例如:

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

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

    【讨论】:

    • 我在代码中发现了另一个问题,Bar 与 Foo 一样,对另一个类有一个循环的一对一引用...
    【解决方案2】:

    我的问题是 I Bar 对另一个对象有另一个循环引用,比如 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 表中的几个字段,这有点过头了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-21
      • 2017-02-17
      • 2015-04-03
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多