Проблема с аудитом NHibernate и унаследованными классами
У меня есть Animal
класс, который реализует IDomainObject
, Есть еще один класс, Cat
что наследует от Animal
, Я использую стратегию наследования Table Per Subclass для своих отображений NHibernate и отображаю CreatedDate
а также LastModified
свойства столбцов в Animal
таблица и столбцы в Cat
Таблица.
Я также использую обработчик события PreUpdate, чтобы присвоить LastModified значение.
Когда я обновляю свойство в объекте Cat, в базу данных отправляются два UPDATES: один для Animal
и один для Cat
, Тем не менее, ОБНОВЛЕНИЕ для Animal
это тот, который получает новое значение LastModified и ОБНОВЛЕНИЕ для Cat
сохраняет прежнее значение
Это вызывает некоторые проблемы при повторном получении сущности Cat в другом сеансе. Кажется, что LastModified перезаписывается новым значением (из Animal), эффективно помечая объект как "грязный", и вызывает другое ОБНОВЛЕНИЕ.
Кажется, что-то не так с моим общим дизайном, но я не уверен, что это такое. Что может быть лучше для этого?
public class Animal : IDomainObject {
// ... various properties
public virtual DateTime CreatedDate { get; set; }
public virtual DateTime LastModified { get; set; }
public virtual int Version { get; protected set; }
}
public class Cat : Animal {
// ... various properties
public override DateTime CreatedDate { get; set; }
public override DateTime LastModified { get; set; }
public override int Version { get; protected set; }
}
public interface IDomainObject {
DateTime CreatedDate { get; set; }
DateTime LastModified { get; set; }
int Version { get; }
}
public bool OnPreUpdate(PreUpdateEvent eventItem) {
if (!(eventItem.Entity is IDomainObject)) {
return false;
}
var entity = eventItem.Entity as IDomainObject;
if (entity == null) {
return false;
}
var lastModified = DateTime.Now;
PersistState(eventItem.Persister, eventItem.State, "LastModified", lastModified);
entity.LastModified = lastModified;
return false;
}
private void PersistState(IEntityPersister persister, object[] state, string propertyName, object value) {
var index = Array.IndexOf(persister.PropertyNames, propertyName);
if (index == -1) {
return;
}
state[index] = value;
}
1 ответ
Две вещи, которые я не понимаю:
Почему вы переопределяете CreatedDate, LastModified и Version в своем классе Cat- когда у них нет новой функциональности?
Почему у вас есть эти три столбца в обеих таблицах?
Должно быть достаточно иметь три столбца / свойства в базовом классе - все остальное вызывает проблемы.