Для комментариев разрешается с помощью:
SELECT * FROM
TABLE_shares
WHERE DATE_SHARE > DATE_SUB(NOW(), INTERVAL 7 DAY)
, которые могут использовать индекс DATE_SHARE
Я не знал бы, как достигнуть того, что Вы хотите с ISaveOrUpdateListener
интерфейс - Вы могли однако использовать в своих интересах факт это IPreUpdateEventListener
и IPreInsertEventListener
интерфейсы оба обеспечивают то, в чем Вы нуждаетесь..., например, делаете что-то вроде этого:
public bool OnPreUpdate(PreUpdateEvent evt)
{
string[] names = evt.Persister.PropertyNames;
for(int index = 0; index < names.Length; index++)
{
// compare evt.State[index] to evt.OldState[index] and get
// the name of the changed property from 'names'
// (...)
}
}
и сделайте то же самое для пред вставка.
Вы могли реализовать Шаблон "memento" для сериализации состояния от начальной Загрузки через ILoadEventListener. Очевидно, Вы не хотите хранить наборы / отношения, или Вы копировали бы целый граф объектов. Можно затем вытащить это и выдержать сравнение в ISaveOrUpdateEventListener.
Вы также можете использовать метод FindDirty на Persister, чтобы позволить NHibernate делать сравнения за вас:
var dirtyFieldIndexes = @event.Persister.FindDirty(@event.State, @event.OldState, @event.Entity, @event.Session);
foreach (var dirtyFieldIndex in dirtyFieldIndexes)
{
var oldValue = @event.OldState[dirtyFieldIndex];
var newValue = @event.State[dirtyFieldIndex];
// Log values to new "AuditLog" object and save appropriately.
}