遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

EF 使用 POCO中的对象状态跟着

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

posted on 2012-06-15 09:34  遗忘海岸  阅读(864)  评论(0编辑  收藏  举报