Правильная установка набора связанных сущностей в EF4 с использованием POCO (src - это БД) - PullRequest
0 голосов
/ 04 марта 2011

У меня есть объект POCO Report с набором связанных объектов POCO Reference.При создании Report я получаю ICollection<int> идентификаторов.Я использую эту коллекцию для запроса справочного хранилища, чтобы получить ICollection<Reference>, например, так:

from r in referencesRepository.References
where viewModel.ReferenceIds.Contains(r.Id)
select r

Я бы хотел подключить коллекцию прямо к Report, например, так:

report.References = from r in referencesRepository.References
                    where viewModel.ReferenceIds.Contains(r.Id)
                    select r;

Это не работает, потому что References - это ICollection, а результат - IEnumerable.Я могу сделать ToList(), но я думаю, что тогда я буду загружать все ссылки в память.Также нет функции AddRange().

Я бы хотел сделать это без загрузки их в память.

Мой вопрос очень похож на этот один,Там единственное решение состояло в том, чтобы пройтись по пунктам и добавить их один за другим.За исключением этого вопроса, список литературы не взят из базы данных (что, казалось, имело значение).В моем случае коллекция действительно поступает из базы данных.Поэтому я надеюсь, что это как-то возможно.

Заранее спасибо.

1 Ответ

1 голос
/ 04 марта 2011

При работе с платформой сущностей вы должны загружать объекты в память, если вы хотите работать с ними, поэтому в основном вы можете сделать что-то вроде этого:

report.References = (from r in referencesRepository.References
                    where viewModel.ReferenceIds.Contains(r.Id)
                    select r).ToList();

Другой подход - использование фиктивных объектов, но это может вызвать другие проблемы. Фиктивный объект - это новый экземпляр объекта Reference, в котором только Id установлен на PK существующего объекта в БД - он будет действовать как этот существующий объект. Проблема в том, что когда вы добавляете Report объект в контекст, вы должны вручную установить каждый экземпляр Reference в ObjectStateManager в состояние Unchanged, иначе он будет вставлен в БД.

report.References = viewModel.ReferenceIds.Select(i => new Reference { Id = i }).ToList();

// later in Report repository
context.Reports.AddObject(report);
foreach (var reference in report.References)
{
  context.ObjectStateManager.ChangeObjectState(reference, EntityState.Unchanged);
}
...