Entity Framework: я не понимаю цели EntityCollection.Attach и EntityReference.Attach - PullRequest
0 голосов
/ 15 ноября 2011

ObjectContext.Attach и ObjectSet.Attach используются для присоединения отсоединенной сущности (которая уже существует в БД) к контексту - таким образом, когда вызывается ObjectContext.SaveChanges , EF не пытаетсяотправить команду вставки для этого присоединенного объекта

Но я не понимаю цели EntityCollection.Attach и EntityReference.Attach.А именно, эти два метода могут присоединять только те объекты, которые уже управляются ObjectContext (таким образом, их нельзя использовать для присоединения объектов с EntityState, установленным на Added или Detached).

И поскольку сущности, управляемые ObjectContext, уже автоматически разрешают свои отношения (т.е. их свойство EntityReference возвращает родительскую сущность, а их свойство EntityCollection содержит связанные дочерние сущности), я не понимаю, что именномы получаем с помощью EntityCollection.Attach или EntityReference.Attach для присоединения связанной сущности E1 к конкретной сущности E2 , поскольку E1 уже присоединена к E2 автоматически ObjectContext?

Спасибо

1 Ответ

1 голос
/ 16 ноября 2011

Например, если у вас есть клиент в ObjectContext и вы хотите получить его При бронировании клиента вы можете позвонить по следующему номеру:

myCust.Reservations.Load()

Это загрузит все резервирования для этого клиента. Однако, если вы хотите отфильтровать эти резервирования, вы можете использовать CreateSourceQuery в вместо, как показано в следующем коде:

var customer=context.Contacts.OfType<Customer>().First();
var sourceQuery = customer.Reservations.CreateSourceQuery()
                    .Where(r => r.ReservationDate > new DateTime(2008, 1, 1));
customer.Reservations.Attach(sourceQuery);

Запрос будет выполнен при вызове метода Attach. Теперь только часть резервирований для этого клиента будет извлечена из базы данных и материализована как объекты.

Вы также можете использовать CreateSourceQuery для фильтрации по типам. В следующем коде Attach is используется с EntityReference, который не будет принимать IQueryable. Вместо этого вам нужно передать объект, который вы можете получить с помощью метода запроса FirstOrDefault. поскольку Attach выдаст исключение, если вы попытаетесь передать значение NULL, вам нужно проверить на NULL перед звонком Прикрепить:

var addresses = context.Addresses.Take(5);
foreach (var a in addresses)
{
  var sq = a.ContactReference.CreateSourceQuery()
            .OfType<Customer>().FirstOrDefault();
  if (sq != null)
    a.ContactReference.Attach(sq);
}

С этим кодом будут загружаться только клиенты.

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