Я использую события NHibernate OnPreInsert и OnPreUpdate в PreSaveEventListener для установки CreatedDate и ModifiedDate моих сущностей. Проблема в том, что есть две сущности, для которых оба события запускаются при первом их создании. Это вызывает проблему , так как состояние объекта не сохраняется после события OnPreInsert, поэтому событие OnPreUpdate работает со всем новым состоянием объекта, и мой CreatedDate никогда не устанавливается (по умолчанию 01/01 / 0001).
Сначала я подумал, что это потому, что мой код инициировал два вызова SaveOrUpdate до конца транзакции. Конечно же, я нашел код на этот счет. Но потом я понял, что это все еще происходит для другой сущности. Насколько я могу судить, только эти два объекта имеют эту проблему. Я временно решил проблему, установив CreatedDate в их конструкторах, но хочу этого избежать.
Вот моя структура:
Бизнес-объект (абстрактный класс, который имеет два конкретных объединенных подкласса)
Организация BusinessContact, имеющая отношения «многие к одному» с Business
РЕДАКТИРОВАТЬ: Недавно я понял, что это также происходит на одном другом объекте (InvoiceLineItem), но не почти идентичный объект (BillLineItem), созданный и используется почти идентичными способами. Кажется довольно произвольным.
Кто-нибудь видел это раньше?
Вот код слушателя события:
public class PreSaveEventListener : IPreInsertEventListener, IPreUpdateEventListener {
public bool OnPreInsert(PreInsertEvent @event) {
EntityWithGuidId entity = @event.Entity as EntityWithGuidId;
if (null != entity) {
var createdDate = DateTime.Now;
var modifiedDate= DateTime.Now;
Set(@event.Persister, @event.State, "CreatedDate", createdDate);
Set(@event.Persister, @event.State, "ModifiedDate", modifiedDate);
entity.CreatedDate = createdDate;
entity.ModifiedDate = modifiedDate;
}
return false;
}
public bool OnPreUpdate(PreUpdateEvent @event) {
EntityWithGuidId entity = @event.Entity as EntityWithGuidId;
if (null != entity) {
var modifiedDate= DateTime.Now;
Set(@event.Persister, @event.State, "ModifiedDate", modifiedDate);
entity.ModifiedDate = modifiedDate;
}
return false;
}
private void Set(IEntityPersister persister, object[] state, string propertyName, object value) {
var index = Array.IndexOf(persister.PropertyNames, propertyName);
if (index == -1)
return;
state[index] = value;
}
}