У меня есть класс Animal
, который реализует IDomainObject
.Есть еще один класс, Cat
, который наследуется от Animal
.Я использую стратегию наследования таблицы на подкласс для своих сопоставлений NHibernate и сопоставляю свойства CreatedDate
и LastModified
со столбцами в таблице Animal
и со столбцами в таблице Cat
.
Iтакже используйте обработчик события PreUpdate для присвоения LastModified значения.
Когда я обновляю свойство в объекте Cat, в базу данных отправляются два UPDATES: один для Animal
и один для Cat
.Однако UPDATE для Animal
- это тот, который получает новое значение LastModified, а UPDATE для 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;
}