Entity Framework何时填充导航属性?

时间:2012-09-07 10:04:02

标签: .net entity-framework

我正在使用带有工作单元/存储库模式的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()?

1 个答案:

答案 0 :(得分:4)

  

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

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

  

这是执行此操作的最佳方式,还是应该在收到交易时明确将Store添加为Include()?

没有一种最好的方式。

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

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

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