我正在使用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
对象?
答案 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)
};
击> <击> 撞击>
忽略。