Проблема с аудитом 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 ответ

Решение

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

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

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

Должно быть достаточно иметь три столбца / свойства в базовом классе - все остальное вызывает проблемы.

Другие вопросы по тегам