繁体   English   中英

加载并加载ADO.NET实体框架

[英]ADO.NET Entity Framework IsLoaded and Load

我发现自己在使用ADO.NET实体框架时一遍又一遍地重复这样的代码。

VB:

' Load the thing if not already loaded. '
If Not Something.Thing.IsLoaded Then
    Something.Thing.Load()
End If

C#:

// Load the thing if not already loaded.
if (!Something.Thing.IsLoaded)
{
    Something.Thing.Load();
}

这正常吗? 我应该经常使用IsLoadedLoad吗? 还是我使用不正确?

根据调用对象(例如存储库)的方式,可以执行的操作是在实体基础集上使用“ Include()”方法。

     return EntitiesObject.Something.Include("Thing").Where(x=>x.ID == ID)

这样做将返回已加载“事物”的对象。

这是一篇很好的文章:

http://msdn.microsoft.com/zh-CN/library/bb896272.aspx

在这方面, VS2010 beta中的EntityFramework版本要友好得多。 就是说,如果您坚持使用该版本而不进行延迟加载,则此扩展方法可能会帮助您:

public static T EnsureLoaded<T>(this EntityReference<T> eRef) where T: class, IEntityWithRelationships
{
    if (!eRef.IsLoaded)
        eRef.Load();

    return eRef.Value;
}

然后,假设您的用户对象具有联系人,则可以执行以下操作:

Contact c = User.ContactReference.EnsureLoaded();

它仍然很麻烦,但是我发现最好反复编写IsLoaded if语句。

例如,如果要加载7个客户的列表,然后为每个客户加载订单。

如果这样做是通过加载客户,然后遍历每个客户,检查订单是否已加载然后再加载。 您将收到8(1 + 7)个对数据库的调用。

如果改为在获取客户时使用Include(“ Orders”),则将没有循环,没有if语句,只有一个数据库调用。

实体框架4将具有延迟加载。

我赞同西拉子的话。 另外,我经常发现自己通过将EF生成的属性包装在部分类中来实现延迟加载。 这是一个例子:

public partial class Customer
{
      public EntityCollection<Order> CustomerOrders
      {
          get
          {
              if (!Orders.IsLoaded)
                  Orders.Load();

              return Orders;
          }
      }
}

在主叫侧节省一些重复。

这是完全正常的并且是预期的。 但是,这会使性能优化变得困难。 不幸的是,如果要确保已加载对象,则Include语句仍然需要在之后调用IsLoaded和Load。

我已经为1-n关系扩展了tclem解决方案:

public static EntityCollection<T> EnsureLoaded<T>(this EntityCollection<T> eRef) where T : class, IEntityWithRelationships
{
    if (!eRef.IsLoaded)
        eRef.Load();

    return eRef;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM