2009-10-02 5 views
3

В моем приложении у меня есть несколько разных типов сущностей, которые у меня есть требование для отслеживания изменений на уровне поля. Я искал это для Google и только мог придумать примеры выполнения простых проверок «Date Inserted» и «Date Update», когда вы просто изменяете поля уже существующего объекта. Мои требования являются более сложными, потому что:Как я могу выполнить общее отслеживание изменений на уровне компонентов и компонентов на уровне NHibernate?

  1. Мне нужно создать новые объекты, представляющие изменения не только изменять поля на сущности сохраняются (как с вставленной датой, дата обновления примеры, которые я нашел)
  2. I необходимо сохранить эти новые сущности в БД в той же транзакции, обновляющей отслеживаемый объект
  3. Мне нужно отслеживать изменения в коллекции объектов ValueObject, прикрепленных к отслеживаемому объекту
  4. Я не хочу писать отдельный код регистрации для каждый гусеничный объект

Примера код:

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.

ответ

1

Что вы хотите - использовать Iinterceptor сеанса. вы можете найти образец использования для аудита here

Также вы получите больше ответа от NHibernate mail list.

 Смежные вопросы

  • Нет связанных вопросов^_^