私はブログ/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
}
}