Проблема с аудитом NHibernate и унаследованными классами - PullRequest
0 голосов
/ 18 августа 2010

У меня есть класс 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;
}

1 Ответ

2 голосов
/ 18 августа 2010

Две вещи, которые я не понимаю:

  1. Почему вы переопределяете CreatedDate, LastModified и Version в своем классе Cat - когда у них нет новой функциональности?

  2. Почему у вас есть эти три столбца в обеих таблицах?

Этого должно быть достаточно, чтобы в базовом классе было три столбца / свойства- что-нибудь еще напрашивается на неприятности.

...