Entity Framework 何时填充导航属性?

3
我正在使用带有工作单元/仓储模式的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'的导航属性。只有在repeater数据绑定时才需要加载Store。我猜这是加载导航属性的地方,但不确定。

这种方式是否最好?还是当我获取Deals时应该明确添加Store作为Include()?

1个回答

4
只有在重复器数据绑定时才能加载Store。我猜这是加载nav属性的地方,但我不确定。
是的,当引用属性时,惰性加载的导航属性会被加载,并且绑定到该属性也会引用它。
这是最好的方法吗?还是应该在获取Deals时显式添加Include()?
没有单一最佳方法。
如果您的Deals链接到10个不同的商店,则惰性加载deal.Store将导致发送到数据库的10个单独查询,除了获取Deals的一个查询之外。如果使用“deals.Include(“ Store”)”,则一个查询将一次检索交易和商店,但每个交易的每个商店数据都会重复。哪个执行更好取决于情况。
如果使用惰性加载,则可能会出现不一致性,如果在加载交易后但在加载商店之前删除商店及其交易。可以通过使用事务来避免这种情况,但在这种情况下,事务必须持续到加载商店为止。
您需要权衡不同方法的优缺点,以确定哪种方法最适合您的情况。

谢谢你的建议。引发这个问题的担忧是那10个查询。回答你的问题,如果我正在收集商店的交易,那么所有的交易都是一样的;但是,如果按照类别来分,可能会涉及到10个不同的商店。 - dotnetnoob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接