附加对象与实体框架中的Detached对象

时间:2011-04-08 18:00:19

标签: asp.net-mvc wcf entity-framework

使用附加对象与分离对象有什么好处?

我目前在我的存储库中执行的操作是在更新或删除它之前手动分离我的对象。因此,如果我正在更新或删除,我不会进行往返,但我会通过ID删除。我认为使用分离方案对我有用。我做错了吗?

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

2 个答案:

答案 0 :(得分:5)

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

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

在您拥有许多上下文实例的环境中,分离的对象也将极大地简化EF的使用。只需在进行更改和保存之前附加对象。

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

编辑:

在分离的实体上进行延迟加载不起作用,因为它没有要为其查询引用的上下文。实体也可能缺少必需的代理和实体密钥。

我非常建议使用预先加载。这也可能是最终的优化,因为很难控制延迟加载的影响。因为它可能会产生如果您正在迭代集合的情况,它将向数据库请求集合中的每个对象。当你有大量的集合时,这可能会有很多问题。

答案 1 :(得分:1)

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