3

NHibernateを使用して、データベースに行を一括挿入しています。挿入するデータ量が多いため、のIStatelessSession代わりに使用していISessionます。挿入するオブジェクトは、割り当てられたIDを使用します(つまり、hiloまたはGUIDは生成されません。一意のIDがオブジェクトに割り当てられます)。

私の問題は、Foo別のオブジェクト(say)への多対1の参照を持つオブジェクト(say )があることBarです。Bar最初にすべてのオブジェクトを挿入しますが、問題ありません。

オブジェクトを挿入したいときに問題が発生しFooます。各オブジェクトの一意の識別子は知っていますが、オブジェクトを挿入する前にオブジェクトにプロパティを設定するために、データベースからBar各オブジェクトを取得する必要はありません。BarFoo

ここで、簡単な例を示す良い機会かもしれません。

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; }
}

(たとえば)4567のIDを持つオブジェクトを参照する(たとえば)1234の新しいFooオブジェクトを作成したいとします。以前にすべてのオブジェクトを追加したので、この識別子を持つオブジェクトがすでに存在することがわかります。 。IdBarBarBar

データベースからオブジェクトを再度Foo取得せずにオブジェクトを追加するにはどうすればよいですか?Bar

4

4 に答える 4

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:ダミーのBarオブジェクトを使用して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();
    }
}

しかし、誰かがより良い方法を持っている場合(たとえば、ダミーオブジェクトをたくさん作成する必要がない場合)、アドバイスをいただければ幸いです。

于 2012-03-21T08:40:25.353 に答える
2

BarオブジェクトDictionary<int, Bar>を挿入した後、に保存し、正しいBarオブジェクトへの参照を割り当てます。

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

ソリューションも機能しますが、Bar.Idのパブリックセッターが必要です。

于 2012-03-21T13:20:18.153 に答える
0

session.Get(id)を使用できます。セッションにBarのエンティティがある場合は、プロキシが返され、データベースを呼び出さずにプロキシ参照によってFooオブジェクトが作成されます。

于 2012-03-21T09:49:55.860 に答える
0

これはデータベースにアクセスすることはなく、エンティティをロードせずに外部キーを設定する方法です。

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

無視。

于 2012-03-21T11:23:36.050 に答える