Entity Framework 和对象分离

5
在构建使用实体框架作为数据访问层的 Web 应用程序时,建议从对象上下文中分离对象以允许垃圾回收。但由于 Web 应用程序都是请求-响应应用程序,因此在响应发送给客户端后,对象上下文本身不再被任何活动对象引用,因此对象上下文及其附加的对象应该可供垃圾回收,因为没有任何活动对象引用它们。我是否遗漏了什么,或者在这种情况下分离对象是不必要的?

你有这个建议的来源吗?实际上,EF使分离变得非常困难。 - Chris S
5个回答

2
我猜测你看到的指南是在谈论无跟踪查询。
对于读取密集型网站,无跟踪查询确实具有一些性能优势。
对象从不被附加和跟踪身份,因此您不需要将它们分离,这避免了在物化期间进行身份解析的成本。
无跟踪查询的示例如下:
var source = ctx.Staff;
source.MergeOption == MergeOption.NoTracking;

var staff = (from s in source
             where s.ID == 12 
             select s).First();

没有跟踪查询与手动分离实体相比,还有一个好处:手动分离会将实体与其余的实体图断开连接,而使用无跟踪查询可以检索到所有已分离的实体的连接图。
但是,使用非跟踪查询也有一些缺点:由于关闭了标识解析,有时可能会出现读取重复结果的情况。
因此,除非您确信查询只会返回每个实体的一个副本,否则应谨慎操作,否则可能会出现 UI 错误。
希望这有所帮助。
Alex
附注:ObjectContext 生命周期提示可能对您有所帮助。

Alex,EF中使分离实体变得如此困难的设计决策是什么? - Chris S
我不确定,当时我没有参与EF。 - Alex James
...但我相信,这归结于作用域决策,即选择更容易使用的方法,在当时并没有达到标准。 - Alex James

0
Muhammad,我无法与EF交流,但就Linq-to-SQL而言,分离对象与垃圾回收无关。它涉及将对象从数据库上下文中分离,以便可以将其附加到另一个对象上。这是在无状态(n层)应用程序中非常常见的事情。EF可能也适用于此。
兰迪

0

这篇文章可能会对你有所帮助。EF的设计与NHibernate类似,使用默认的有状态会话/上下文(即Windows窗体应用程序)。自从版本1发布以来,这种情况可能已经发生了改变,那是我最后一次查看它的时候。不过这有点奇怪,因为大多数人将在网站上使用它,就像NHibernate让你使用每个请求一个会话,并且并非主要是为网站而设计。

这个想法是你不需要担心更新或插入,所有操作都会自动完成。这会增加内存使用量,但如果应用程序正确管理,通常会提高性能而不是降低性能。


1
EF被设计为“有状态”的上下文,而不是无状态的上下文。 - Alex James
那显然是一个笔误,我相信你读了第二段就能推断出来。 - Chris S

0
在 EF 中,如果您需要在 n 层应用程序中使用多个上下文,或者想要创建一个 entityCollection,则需要分离实体。但对于 asp.net 应用程序来说,这并不是一项强制性的实现。

0

假设您没有保留对象上下文(以某种方式持有对其的引用),一旦它超出范围,它将被垃圾回收。我认为没有必要分离实体。

所以,我认为您没有错过任何东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接