2010-10-19 78 views
5

有人能指出POCO,自追踪实体,POCO代理之间的区别吗?EF4:POCO,自追踪实体,POCO代理之间的区别

实际上,我正在使用Entity Framework 4.0和POCO(Repository Pattern),并且每当我在POCO中进行一些更改并调用ObjectContext.Savechanges时,它都会反映到数据库中。 我的问题是,

  1. 上下文是如何持续改变数据库,因为它没有被跟踪?
  2. 上下文是否为POCO动态生成跟踪信息?我使用

示例代码,

 IEFRepository<Category> catRepository = new EFRepository<Category>(); 
     Category c = catRepository.FindOne<Category>(x => x.Name == "Paper"); 

     c.Name = "Paper"; 
     catRepository.SaveChanges(System.Data.Objects.SaveOptions.None); 

回答

6

自我跟踪实体不是波苏斯。相反,他们非常注重持久性。甚至比EntityObject实体还要多。什么使他们独一无二的是即使他们没有附加到ObjectContext也可以跟踪变化。

正如你所说,“纯”的POCO使得变更追踪变得困难。真的,你唯一能做的就是比较对象的快照。对象上下文有一个DetectChanges方法。

使用伪POCO代理,您真正拥有的是在编译时看起来(几乎)像POCO的类型,并且像运行时的​​非POCO。我说“几乎”,因为在运行时你会得到一个实例,它是编译时类型的一个子类型。因此,您想跟踪更改的任何属性都必须是非私有和虚拟的。类似的限制适用于延迟加载。您可以在ADO.NET团队博客上阅读this series of articles的更多信息。

+1

感谢克雷格,并回答我的问题的第二部分是ProxyCreationEnabled应该是假的。在使用POCO代理时,EF使用.NET框架中的AssemblyBuilder和TypeBuilder即时生成代理类型。 – paragy 2010-10-20 11:43:38