NHibernate IStatelessSession的Load方法的等价

时间:2012-03-21 08:29:12

标签: c# nhibernate istatelesssession

我正在使用NHibernate将行批量插入到我的数据库中。由于我要插入的数据量,我使用的是IStatelessSession而不是ISession。我插入的对象使用指定的标识(即没有生成hilo或guid - 将唯一ID分配给对象)。

我的问题是我有一个对象(比如Foo),它对另一个对象有多对一的引用(比如Bar)。我先插入所有Bar个对象,这没问题。

当我想插入Foo个对象时出现问题。我知道每个Bar对象的唯一标识符,但我不想从数据库中检索每个Bar对象,以便在插入之前在Foo对象上设置属性它

现在可能是展示一个简单例子的好时机:

public class Foo {
    // Unique identifier (assigned)
    public virtual int Id { get; set; }

    // Many-to-one reference to a Bar object
    public virtual Bar Bar { get; set; }
}

public class Bar {
    // Unique identifier (assigned)
    public virtual int Id { get; set; }
}

假设我想要创建一个新的Foo对象,其中Id的(例如)1234引用一个Bar对象,其ID为(例如)4567.I知道已经有一个带有此标识符的Bar对象,因为我之前添加了所有Bar个对象。

如何在不必再次从数据库中检索Foo对象的情况下添加Bar对象?

4 个答案:

答案 0 :(得分:4)

奇怪的是,有时如果你花时间来表达你的问题,你很快就会意识到答案。

您所做的是创建一个虚拟对象,该对象具有Id并且没有其他设置。

第1步:插入条形对象

using (var session = SessionFactory.OpenStatelessSession())
{
    using (var tx = session.BeginTransaction())
    {
        var bar = new Bar
        {
            Id = 1234,
            // and populate all of the other
            // properties that you would put here
        };
        session.Insert(bar);
        tx.Commit();
    }
}

步骤2:使用虚拟条形对象插入Foo对象

using (var session = SessionFactory.OpenStatelessSession())
{
    using (var tx = session.BeginTransaction())
    {
        var foo = new Foo
        {
            Id = 4567,
            // dummy Bar object that has an Id and nothing else
            Bar = new Bar {Id = 1234}
        };
        session.Insert(foo);
        tx.Commit();
    }
}

但如果有人有更好的方法(例如,不需要创建大量的虚拟对象),我会很感激你的建议。

答案 1 :(得分:2)

插入条形码后,将条形对象存储在Dictionary<int, Bar>中,并将引用分配给正确的条形对象:

var foo = new Foo();
foo.Bar = bars[1234];
session.Save(foo); // there is no session.Insert method

您的解决方案也有效,但需要Bar.Id的公共设置器。

答案 2 :(得分:0)

你可以使用session.Get(id),如果会话有Bar的实体,它会返回一个代理,你将通过代理引用创建Foo对象而不需要调用DataBase。

答案 3 :(得分:0)

这样做 NOT 访问数据库,是一种填充外键而无需加载实体的方法。

var foo = new Foo
{
  Id = 4567,
  Bar = new Session.Get<Bar>(1234)
};

<击>

忽略。