В моем приложении у меня есть несколько разных типов сущностей, которые у меня есть требование для отслеживания изменений на уровне поля. Я искал это для Google и только мог придумать примеры выполнения простых проверок «Date Inserted» и «Date Update», когда вы просто изменяете поля уже существующего объекта. Мои требования являются более сложными, потому что:Как я могу выполнить общее отслеживание изменений на уровне компонентов и компонентов на уровне NHibernate?
- Мне нужно создать новые объекты, представляющие изменения не только изменять поля на сущности сохраняются (как с вставленной датой, дата обновления примеры, которые я нашел)
- I необходимо сохранить эти новые сущности в БД в той же транзакции, обновляющей отслеживаемый объект
- Мне нужно отслеживать изменения в коллекции объектов ValueObject, прикрепленных к отслеживаемому объекту
- Я не хочу писать отдельный код регистрации для каждый гусеничный объект
Примера код:
public interface ITrackChanges {}
{
}
public class Account : ITrackChanges
{
public int Id;
public string AccountNumber;
public string CustomerName;
public string CustomerAddress;
}
public class Computer : ITrackChanges
{
public int Id;
public string AssetTag;
public string SerialNumber;
public IEnumerable<IPAddress> IPAddresses;
}
public class IPAddress : ValueObject
{
public string Address;
}
Всякий раз, когда какие-либо из значений учетной записи или компьютера изменений или списка IPaddresses, связанный с изменениями компьютера объекта, нужно создать и сохранить эти записи изменений объекта:
public class EntityChange
{
public string EntityType;
public string EntityId;
public string PropertyName;
public string OldValue;
public string NewValue;
}
Каждый отслеживаемый объект реализует интерфейс маркера ITrackChanges, и каждый объект значения наследуется от базового класса ValueObject. Объекты значения отображаются как компоненты в NHibernate.
В качестве примера того, что я хочу получить в качестве конечного результата, если я обновляю объект Computer с помощью Id 1 и изменяю AssetTag с «ABC123» на «ABC124» и изменяю список IP-адресов из { "1.2.3.4"} до { "1.2.3.4", "1.2.3.5"}, я должен получить 2 EntityChange записей:
EntityChange #1
{
EntityType = "Computer"
EntityId = 1
PropertyName = "AssetTag"
OldValue = "ABC123"
NewValue = "ABC124"
}
EntityChange #2
{
EntityType = "Computer"
EntityId = 1
PropertyName = "IPAddresses"
OldValue = "1.2.3.4"
NewValue = "1.2.3.4, 1.2.3.5"
}
Любые идеи на лучший способ для реализации этого? Из моего чтения документов, похоже, мне нужно написать прослушиватель перехватчика и/или событий, но мне не удалось найти какие-либо примеры за пределами некоторых, которые просто изменяют обновляемую сущность. Пример кода определенно приветствуется в любых ответах.
Я ошибаюсь, полагая, что это должно быть что-то, поддерживаемое NHibernate? Я смог реализовать это в предыдущем приложении, которое использовало LLBLGen как ORM, но это первый раз, когда я должен был реализовать это в приложении с использованием NHibernate.