Have a look to nhibernate events and listeners.

2009/10/2 David Archer <[email protected]>

>
> (Cross posting from a question I asked on StackOverflow earlier today.
> Feel free to answer there or answer here in the newsgroup.)
>
>
> http://stackoverflow.com/questions/1511348/how-can-i-do-generic-field-and-component-level-change-tracking-in-nhibernate
>
> In my application, I've got a few different types of entities that I
> have a requirement to do field-level change tracking on. I've googled
> for this and only can come up with examples on doing simple "Date
> Inserted" and "Date Updated" audit tracking where you just modify
> fields on the entity being persisted already. My requirements are more
> complex because:
>
> 1. I need to create new entities representing the changes not just
> modify fields on the entity being saved (as with the Date Inserted,
> Date Updated examples I've found)
> 2. I need to save these new entities to the DB in the same transaction
> updating the tracked entity
> 3. I need to track changes to collections of ValueObjects attached to
> the tracked entity
> 4. I don't want to have to write seperate logging code for every
> tracked entity
>
> Example code:
>
> 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;
> }
>
> Whenever any of the values of an Account or Computer object changes or
> the list of IPAddresses associated with a Computer object changes, I
> need to create and save these entity change records:
>
> public class EntityChange
> {
>    public string EntityType;
>    public string EntityId;
>    public string PropertyName;
>    public string OldValue;
>    public string NewValue;
> }
>
> Each tracked entity implements the ITrackChanges marker interface and
> each value object inherits from the ValueObject base class. The value
> objects are mapped as components in NHibernate.
>
> As an example of what I'm looking to get as the end result, if I
> update the Computer object with Id 1 and change the AssetTag from
> "ABC123" to "ABC124" and change the list of IP addresses from
> { "1.2.3.4" } to { "1.2.3.4" , "1.2.3.5" }, I should get 2
> EntityChange records:
>
> 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"
> }
>
> Any ideas on the best way to implement this? From my reading of the
> docs, it looks like I need to write an interceptor and/or event
> listener but I haven't been able to find any examples beyond some that
> just modify the entity being updated. Example code is definitely
> welcome in any responses.
>
> Am I wrong in assuming that this should be something supported by
> NHibernate? I was able to implement this in a previous application
> that used LLBLGen as the ORM but this is the first time I've had to
> implement this in an application using NHibernate.
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to