ADO.NET Entity Framework IsLoaded и загрузка - PullRequest
1 голос
/ 10 ноября 2009

Во время использования ADO.NET Entity Framework я снова и снова повторяю подобные фрагменты кода.

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();
}

Это нормально? Должен ли я использовать IsLoaded и Load так часто? Или я не правильно использую это?

Ответы [ 6 ]

4 голосов
/ 11 ноября 2009

Версия EntityFramework в бета-версии VS2010 намного, намного дружелюбнее в этом отношении. Тем не менее, если вы застряли с версией без отложенной загрузки, этот метод расширения может помочь вам:

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

    return eRef.Value;
}

Затем, если у вас есть объекты User с контактами, вы можете сделать:

Contact c = User.ContactReference.EnsureLoaded();

Это все еще довольно отстойно, но я считаю, что предпочтительнее писать IsLoaded if, оператор снова и снова.

4 голосов
/ 10 ноября 2009

В зависимости от того, как вы вызываете объект (например, хранилище), вы можете использовать метод "Include ()" в базовом наборе сущностей.

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

Это вернет объект (ы) с уже загруженным «Thing».

Вот хорошая статья об этом:

http://msdn.microsoft.com/en-us/library/bb896272.aspx

1 голос
/ 10 февраля 2010

у меня есть расширенное решение tclem для отношений 1-n:

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

    return eRef;
}
1 голос
/ 13 ноября 2009

Это абсолютно нормально и ожидаемо. Однако это затрудняет оптимизацию производительности. К сожалению, оператор Include все еще требует, чтобы IsLoaded и Load вызывались впоследствии, если вы хотите, чтобы ваши объекты были загружены.

1 голос
/ 10 ноября 2009

Я повторяю то, что сказал Шираз. Кроме того, я часто реализую отложенную загрузку, оборачивая сгенерированное EF свойство в частичный класс. Вот пример:

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

              return Orders;
          }
      }
}

Сохраняет некоторое повторение на вызывающей стороне.

1 голос
/ 10 ноября 2009

Если вы, например, загружаете список из 7 клиентов, а затем загружаете заказы для каждого из клиентов.

Если вы делаете это, загружая клиентов, затем просматривая каждого клиента, проверяя, загружены ли заказы, а затем загружая их. Вы получите 8 (1 + 7) звонков в базу данных.

Если вы вместо этого использовали "Включить" ("Заказы") при получении клиентов, не было бы ни цикла, ни оператора if, а только один вызов в базу данных.

Entity Framework 4 будет иметь ленивую загрузку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...