【问题标题】:Attached objects vs Detached objects in entity framework实体框架中的附加对象与分离对象
【发布时间】:2011-04-08 18:00:19
【问题描述】:

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

我目前在存储库中所做的是在更新或删除对象之前手动分离对象。因此,如果我要更新或删除,我不会进行往返,而是按 ID 删除。我认为处理分离场景对我有用。我做错了吗?

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

【问题讨论】:

  • 您是否通过网络发送实体?您几乎可以保证在您的场景中使用 EF 使用分离和附加实体。即使是单层 Web 应用程序也会在某些时候具有分离的实体。你能澄清一下这个问题吗?

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


【解决方案1】:

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

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

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

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

编辑:

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

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

【讨论】:

  • 有什么方法可以延迟加载分离的对象?
  • “它允许更快的读取,更简单的对象实现” - 我不认为这是真的。你能解释一下吗?
  • 查询将更快地返回对象,因为它不需要将所有跟踪添加到对象,也不需要将对象添加到上下文对象图中。这将导致对象不太复杂(没有更改跟踪)和对对象的更少工作/引用。
  • 我想我们在这里谈论的是纳秒。我之所以这么说,是因为当您说“更快”的开发人员负载时,他们会疯狂地尝试优化他们的应用程序。您表述分离对象的好处的方式使使用它们的性能改进看起来实际上很重要,而实际上并不重要。
  • @jfar - 我遇到过 NoTracking 和 Detached 对象确实产生巨大影响的情况。对于小的结果集或结果集返回的简单对象,差异不会很明显。但是当你有很多加载了属性和导航属性的对象时,它会有所作为。
【解决方案2】:
entity.User.Attach(model);
entity.ObjectStateManager.ChangeObjectState(model,System.Data.EntityState.Modified);
entity.SaveChanges();
return View(model);

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 2016-12-19
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多