隐式延迟加载vs显式延迟加载
问题描述:
我一直在阅读实体框架和人们都在哭,为什么没有隐式延迟加载或什么的。基本上我一直在寻找关于Lazy Loading的东西,现在我知道它是什么:它是一种设计模式,它允许我们在真正需要的时候加载对象。隐式延迟加载vs显式延迟加载
但显式延迟加载和隐含延迟加载之间的区别是什么。
在此先感谢...
答
如果您有一个实体“OrderRow”和另一个实体“Order”,OrderRow上将有一个导航属性指向它所属的Order。
目前实体框架只支持明确延迟加载,这意味着如果你已经retreived一些OrderRows,并希望检查订单的东西,你需要:
// or is an OrderRow
if(!or.Order.IsLoaded)
or.Order.Load()
or.Order.Cancel();
但是,如果你有隐延迟加载你不需要IsLoaded检查,它会自动完成,你可以直接做or.Order.Cancel()
,如果需要,订单将自动加载。这就是linq-to-sql的工作方式,它可以节省一些打字的时间和一些错误风险。另一方面,它不太清楚何时以及如何执行数据库访问。对于隐式加载,很容易编写低效的代码,使得从表中获取每行的一个DB往返。
答
显式表示您明确地将代码写入延迟加载。
隐式意味着框架(在这种情况下是EF)会自动进行延迟加载,无论您是否打算加载。
所以你的意思是显式延迟加载是相关表所需的? – Tarik 2010-04-04 08:33:48
不,隐式加载意味着相关表将自动加载到后台。 – 2010-04-04 08:50:24
..更像在前台。执行会阻塞,直到它被提取。 – 2015-04-20 20:52:47