EF4.1中,有DbChangeTracker对象,
在设置ctx.Configuration.ProxyCreationEnabled = true|false; 两种取值时发现调整实体类属性时都能正确跟着
使用代理类着可以理解,因为代理类可以截获属性的修改,但是不使用代理类是居然也可以。。。
没有去看DBChangeTracker的具体实现,不过推测应该通过轮训机制或者通过在SaveChange等方法调用前执行内存中的快照与当前实体实际属性值比较来实现。
var ctx = new lineDBContext(); ctx.Configuration.ProxyCreationEnabled = false; ctx.Configuration.LazyLoadingEnabled = false; ctx.Configuration.AutoDetectChangesEnabled = true; var items = ctx.PersonClasses.ToList(); items[0].ClassName = "333"; Console.WriteLine(items[0].People.Count); Console.WriteLine(items[1].People.Count); var bhd= ctx.ChangeTracker.Entries<PersonClass>().ToList(); // items[0].ClassName = "333"; 放在这里将显示两个对象都是Unchanged状态,可见Entries<T>()方法会调用DetectChanges() Console.WriteLine(bhd[0].State); Console.WriteLine(bhd[1].State);
参考:
http://blogs.msdn.com/b/adonet/archive/2011/02/06/using-dbcontext-in-ef-feature-ctp5-part-12-automatically-detecting-changes.aspx