实体框架何时填充导航属性



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

这是最好的方法吗?还是当我得到Deals时,我应该明确地将Store添加为Include()?

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

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

这是最好的方法吗?还是当我得到Deals时,我应该明确地将Store添加为Include()?

没有唯一的最佳方式。

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

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

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

最新更新