2012-03-09 12 views
6

NHibernateは、ユーザーまたはアプリケーションによって手動で設定されていない場合にのみ、NHibernateにエンティティのGUIDを生成させます。基本的に、新しいGuid()(すべて0)でオブジェクトを保存するとき、NHibernateはオブジェクトを生成する必要があります。 0以外のGuidを持つオブジェクトを保存するときは、代わりにそのオブジェクトを使用する必要があります。NHibernate Guidジェネレーター(新規の場合)

自分の発電機を作成する唯一の方法はありますか?

編集皆さん、私は「割り当てられました」と認識しています。私はそれを知っていたと明記していたはずです。それは私がしたいことをしないので、私が探しているオプションではありません。私自身の発電機を書くことは機能するオプションですが、私は何か他のものを望みます。私は他に何もないと思っています。

答えて

1

unsaved-value属性を設定しようとしましたか?あなたがSaveOrUpdate()を使用することはできませんしかし

<id name="Id" column="Id" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000"> 
    <generator class="guid.comb" /> 
</id> 

編集は今、私は自分自身の発電機をロールアウトするのではなく、完全に別のオプションをあなたの質問を理解するには、

<generator class="assigned" /> 

を使用することです。代わりに、オブジェクトをSAessionのSave()メソッドまたはUpdate()メソッドのいずれかを呼び出して保存または更新する必要があるかどうかを明示的にNHibernateに指定する必要があります。また、常に新しいエンティティすべてに対してGUIDを手動で設定する必要があります。そのオプション。

+0

をIDを生成whouldいいえ、私はそうではありません。私はそれが0以外の値が保存されていると見なすように動作するとは思わない。それはないかもしれない。私は自分でGUIDを作成したいので私はIdに0以外の値を設定します。 – wasabi

+0

ああそれは違う、あなたは疑問がはっきりしていなかった。 – Rippo

+0

Gosh。私はそれをかなり明確に描いたと思った。 – wasabi

2

ここでの問題は、NHがオブジェクトが新しいかどうか、または既に存在するかどうかを知る必要があることです。これは通常、IDを設定することで行います。

独自のジェネレータを記述した場合、オブジェクトが新しい場合にのみ呼び出されるため、問題は解決されません。

  • assignedジェネレータを使用できます。
  • バージョン列を使用して、オブジェクトが新しいかどうかを示すことができます。私はこのように試したことはありませんが、うまくいくはずです。オブジェクトが新しい場合はNHの表示がないため、かなりの問題が発生します。私を信じてください。
  • また、プライマリキーとしての整数と、通常の一意のフィールドとしてのGUIDを持つこともできます。

私は、クラスのコンストラクタで

class Entity 
{ 
    Guid id; 

    Entity(Guid id = Guid.Empty) 
    { 
    if (id == Guid.Empty) this.id = Guid.NewGuid(); 
    else this.id = id; 
    } 
} 
+0

私は従いません。オブジェクトは新規です。私は、Saveを呼び出す前に、自分のユーザーコードがId値を手動で設定できるようにしたいだけです。 Id == Guid.Zeroの場合には作業する必要があることを除いて、「割り当て済み」と同じです。 – wasabi

+0

ユーザーコードにIDを割り当てる場合は、「割り当て済み」を使用する必要があります。ユーザーコードが割り当てられていないときにidを作成する場合は、オブジェクトのコンストラクタでこれを行います。それはそれと同じくらい簡単です。 –

+0

ステファン、私は両方をしたいと思っている以外はそうだろう。 – wasabi

関連する問題