3

我正在使用具有工作单元/存储库模式的实体框架 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 的要求。我猜这是加载导航属性的地方,但我不确定。

这是执行此操作的最佳方式还是应该在获得交易时将 Store 作为 Include() 显式添加?

4

1 回答 1

4

只有在转发器是数据绑定时才知道加载 Store 的要求。我猜这是加载导航属性的地方,但我不确定。

是的,延迟加载的导航属性会在引用该属性时加载,并且绑定到该属性会引用它。

这是执行此操作的最佳方式还是应该在获得交易时将 Store 作为 Include() 显式添加?

没有单一的最佳方法。

deal.Store如果您的交易链接到 10 个不同的商店,那么除了获取交易的一个查询之外,延迟加载将导致 10 个单独的查询被发送到数据库。如果您使用deals.Include("Store"),一个查询将一次性检索交易和商店,但每个交易的每个商店的数据都会重复。哪个表现更好取决于。

如果您使用延迟加载,如果商店及其交易在加载交易之后但在商店之前被删除,则可能会出现不一致。这可以通过使用事务来避免,但在这种情况下,事务必须持续到商店加载完毕。

您需要权衡不同方法的优缺点,以确定哪种方法最适合您的情况。

于 2012-09-07T10:29:55.247 回答