我正在使用带有工作单元/存储库模式的Entity Framework 4.3。在这种情况下,工作单元是一个请求。
工作单元还明确将延迟加载设置为true。
但是我对这个场景中延迟加载的时间有点困惑,并且会对一些建议表示赞赏。
var context = Local.Items.Uow.Context; // the context
var r = new ReadRepo<Deal>(context); // the repository
var deals = r.Find(); // IQueryable<Deal>
Rpt_BookmarkedDeals.DataSource = deals.ToList();
Rpt_BookmarkedDeals.DataBind();
存储库Deals,具有“Store”的导航属性。加载存储的要求仅在转发器是数据绑定时才知道。我猜这是导航属性加载的地方,但我不确定。
这是执行此操作的最佳方式,还是应该在收到交易时明确将Store添加为Include()?
答案 0 :(得分:4)
加载存储的要求仅在转发器为数据绑定时才知道。我猜这是加载导航属性的地方,但我不确定。
是的,在引用属性时会加载一个延迟加载的导航属性,并且绑定到该属性会引用它。
这是执行此操作的最佳方式,还是应该在收到交易时明确将Store添加为Include()?
没有一种最好的方式。
如果您的交易链接到10个不同的商店,那么延迟加载deal.Store
将导致10个单独的查询被发送到数据库,此外还有一个获得交易的查询。如果您使用deals.Include("Store")
,则一次查询将同时检索交易和商店,但每次交易都会重复每个商店的数据。哪一个表现更好取决于。
如果您使用延迟加载,如果商店及其交易在加载交易后但在商店之前被删除,则可能会出现不一致。这可以通过使用事务来避免,但在这种情况下,事务必须持续到存储加载为止。
您需要权衡不同方法的优缺点,以确定哪种方法最适合您的情况。