2011-04-08 74 views
2

使用附加对象与分离对象有什么好处?附加对象vs实体框架中的独立对象

我目前在我的仓库中做的是在我更新或删除它们之前手动分离我的对象。所以,如果我正在更新或删除,我不会做一个往返,但我通过ID删除。我认为与独立的场景合作对我来说很合适。难道我做错了什么?

我正在使用一个使用asp.net mvc和wcf的n-teir应用程序。

+0

您是否通过电线发送实体?您几乎可以保证在您的场景中使用使用EF的分离和附加实体。即使是单层web应用程序在某个时刻也会有分离的实体。你能澄清这个问题吗? – jfar 2011-04-08 18:11:09

回答

5

使用附加的对象将允许您操作,跟踪更改,进行并发优化。在大多数情况下,我使用附加对象进行更新或在有状态的应用程序中。这也可以让你延迟加载并从上下文缓存中获益。如果您以完全的方式使用实体框架,这非常棒,因为当您需要上下文中的单个对象时,可以减少对数据库的调用次数。在对数据库进行查询之前,使用GetObjectByKey将查询上下文。如果该对象先前已加载,则会为您节省往返数据库的时间。

使用分离对象非常棒!它允许更快的读取,实现更简单的对象,实体上下文的更小内存占用。通过线路发送数据(wcf .. services)也是最好的。任何超出范围的内容,甚至当您将对象转换为域对象时。由于你不需要跟踪对象,所以这是一个很好的优化。这可以使用实体集上的NoTracking合并选项快速实现。

分离对象还将极大地简化在EF上下文环境中的工作。在进行更改和保存之前,只需附加对象即可。

注意:使用NoTracking将不允许您使用延迟加载,更改跟踪,GetObjectByKey或实体框架的任何状态函数。使用NoTracking,你需要使用加载(“Include()”)加载相关的实体/导航属性。 EntityKeys也不会被加载。

编辑:上分离的实体

延迟加载,无法正常工作,因为它没有上下文,指的是它的查询。该实体也可能缺少所需的代理和实体密钥。

我会极大地建议使用热切加载。这也可能是最终的优化,因为很难评估延迟加载的影响。因为它可能会产生如果您正在迭代集合的情况,它会向集合中的每个对象发出对数据库的请求。当您拥有大量收藏品时,这可能会很成问题。

+0

有什么办法让分离的对象延迟加载? – 2011-04-08 19:20:52

+0

“它允许更快的读取,更简单的对象实现” - 我不认为这是真的。你可以解释吗? – jfar 2011-04-08 19:51:07

+0

查询将更快地执行对齐操作,因为它不需要将所有跟踪添加到对象,也不需要将对象添加到上下文对象图中。这将导致不那么复杂的对象(无更改跟踪)和较少的工作/引用对象。 – 2011-04-08 19:54:33

1
entity.User.Attach(model); 
entity.ObjectStateManager.ChangeObjectState(model,System.Data.EntityState.Modified); 
entity.SaveChanges(); 
return View(model);