Take the following data access layer snippet for retrieving a Person entity (AdventureWorks db):
1 2 3 4 5 6 7 8 | public Person GetPerson() { using (AdventureWorksDataContext ctx = new AdventureWorksDataContext()) { //ctx.ObjectTrackingEnabled = false; return ctx.Persons.First(); } } |
To prove this point the following code snippet shows two examples: the first, where the change tracker is kept alive by keeping the ObjectTrackingEnabled set to TRUE, and the second where the change tracker is discarded by setting the ObjectTrackingEnabled to FALSE. The GetPerson method in the DataAccessLayer now contains some code where it retrieves the ChangeTracker object on the data context and assigns it to the WeakReference output parameter so the lifetime of the object can be tracked.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | static void Main( string [] args) { DataAccessLayer layer = new DataAccessLayer(); WeakReference refCTWithTracking; Person person1 = layer.GetPerson( true , out refCTWithTracking); GC.Collect(); Console.WriteLine( "ChangeTrackerWithTracking IsAlive: {0}" , refCTWithTracking.IsAlive); WeakReference refCTWithoutTracking; Person person2 = layer.GetPerson( false , out refCTWithoutTracking); GC.Collect(); Console.WriteLine( "ChangeTrackerWithoutTracking IsAlive: {0}" , refCTWithoutTracking.IsAlive); Console.ReadKey(); } public class DataAccessLayer { public Person GetPerson( bool objectChangeTracking, out WeakReference refChangeTracker) { using (AdventureWorksDataContext ctx = new AdventureWorksDataContext()) { ctx.ObjectTrackingEnabled = objectChangeTracking; PropertyInfo propServices = typeof (AdventureWorksDataContext).GetProperty( "Services" , BindingFlags.NonPublic | BindingFlags.Instance); PropertyInfo propChangeTracker = propServices.PropertyType.GetProperty( "ChangeTracker" , BindingFlags.Instance | BindingFlags.NonPublic); refChangeTracker = new WeakReference(propChangeTracker.GetValue(propServices.GetValue(ctx))); return ctx.Persons.First(); } } } |
No comments:
Post a Comment