1

私はブログ/CMS システムを構築しています (楽しみのために、使用できるものがたくさんあることを知っています)。
Id (int) と TagName (string) プロパティのみを持つ単純な Tag エンティティがあります。次のようなことができるように nHibernate を構成したいと思います。

var tag1 = Tag.CreateTag("duplicate tag test");  // Id=0 at this point
var tag2 = Tag.CreateTag("duplicate tag test");  // Id=0 at this point
TagRepository.Save(tag1);  // tag1.Id is non-zero
TagRepository.Save(tag2);  // tag2.Id should be the same as tag1.Id at this point, but it's not

Assert.AreEqual(tag1, tag2);

私は、Save(Tag) がルックアップのようなことを行うことを想定しています。タグが既に存在する場合は、何らかの形で tag2 を tag1 の値に置き換えます。nHibernate は、パラメーターが out パラメーターとして渡されなくても、パラメーターのプロパティを変更するいくつかの魔法を機能させます。ここで何が起こっているのか、私がやりたいことを行うためにこのメソッドを修正する方法を教えてもらえますか? タグ パラメータで out キーワードを使用する必要がないようにしています。

    public override void Save(Tag tag)
    {
        Tag existingTag = GetByTagName(tag.TagName);
        if (null == existingTag)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.SaveOrUpdate(tag);
                transaction.Commit();
            }
        }
        else
        {
            tag = existingTag; // obviously doesn't impact the caller
        }
    }
4

1 に答える 1

1

「出力パラメーター」への言及は意味がないと思います。オブジェクトは同じインスタンスのままですが、NH は保存時に ID を生成されたものに更新しました。

例で行っているように、最初にタグを取得する必要があると思います。発信者に正しいIDを表示させたい場合は、

tag.id = existingTag.id;

あなたの質問は、NHibernate ではなく、パラメーターとその処理方法に関連していると思います。この記事を読んで、この機能がどのように機能するかを理解してください。

于 2009-04-23T19:08:01.137 に答える