Объединить существующий объект, который ссылается на новый - PullRequest
0 голосов
/ 10 марта 2012

Я загружаю Контакт-объект из базы данных. Контакт объекта имеет однозначное сопоставление с ContactSecurity:

    <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 с указанным контактом перед объединением контакта? - Или есть более простой способ сделать это?

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 11 марта 2012

Ваша проблема не вызвана ContactSecurity.Вам следует изменить настройки каскада как минимум на cascade="save-update", чтобы основной класс мог обновляться и вставлять другие объекты в свои свойства.

1 голос
/ 10 марта 2012

Я так думаю, потому что «ContactSecurity» - это новый временный объект. Если объект с таким же идентификатором уже был сохранен, вы можете использовать «session.Merge ()», но нет объекта с таким идентификатором. Вы можете использовать «session.Persist (ContactSecurity)» для присоединения временного объекта к сеансу.

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

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

В общем, я не понимаю, почему вы используете "session.Merge ()". Если сущность «контакт» является постоянным объектом, вы можете использовать «session.Flush ()» в конце транзакции и не вызывать «session.Merge ()»:

var contactSecurity = new ContactSecurity(Guid.NewGuid());
Session.Persist(contactSecurity);
contact.ContactSecuritys.Add(contactSecurity);
Session.Flush();
...