0

データベースからContact-objektをロードします。オブジェクト連絡先には、ContactSecurityへの1対多のマッピングがあります。

    <set name="ContactSecuritys" lazy="true" inverse="true" cascade="none" >
        <key>
            <column name="ContactId"/>
        </key>
        <one-to-many class="ContactSecurity"/>
    </set>

今、私はしようとします:

contact.ContactSecuritys.Add(new ContactSecurity(Guid.NewGuid()));
Session.Merge(contact);

しかし、これはTransientObjectExcpeptionをスローしています'オブジェクトは保存されていない一時的なインスタンスです-マージする前に一時的なインスタンスを保存してください:Prayon.Entities.ContactSecurity'

私も試しました

contact.ContactSecuritys.Add(new ContactSecurity(Guid.NewGuid()) {Contact = contact});
Session.Merge(contact);

私が間違っていることは何ですか?-連絡先をマージする前に、参照された連絡先を持つ新しいContactSecurity-Objectを追加保存する必要がありますか?-または、これを行うためのより簡単な方法はありますか?

助けてくれてありがとう。

4

2 に答える 2

2

あなたの問題はによって引き起こされていませんContactSecurity。カスケード設定を-に変更する必要があります。cascade="save-update"少なくとも、メインクラスが更新して、そのプロパティに他のオブジェクトを挿入できるようにするためです。

于 2012-03-11T07:46:22.430 に答える
1

「ContactSecurity」は新しい一時的なオブジェクトだからだと思います。同じ識別子を持つエンティティがすでに永続化されている場合は、「session.Merge()」を使用できますが、そのような識別子を持つエンティティはありません。「session.Persist(ContactSecurity)」を使用して、一時オブジェクトをセッションにアタッチできます。

var contactSecurity = new ContactSecurity(Guid.NewGuid());
Session.Persist(contactSecurity);

contact.ContactSecuritys.Add(contactSecurity);
Session.Merge(contact);

一般的に、なぜ「session.Merge()」を使用しているのかわかりません。エンティティ「contact」が永続オブジェクトの場合、トランザクションの最後に「session.Flush()」を使用でき、「session.Merge()」は呼び出さないでください。

var contactSecurity = new ContactSecurity(Guid.NewGuid());
Session.Persist(contactSecurity);
contact.ContactSecuritys.Add(contactSecurity);
Session.Flush();
于 2012-03-10T11:47:41.363 に答える