EF 4.1 с объектами POCO на основе DbContext не лениво загружает свойства внутренней навигации - PullRequest
1 голос
/ 03 мая 2011

Я работаю над веб-приложением в стиле CRM MVC, которое имеет следующую (упрощенную) схему:

Таблица контактов

  • ContactId
  • Имя
  • Фамилия
  • И т. Д.

Теги Таблица

  • TagId
  • Значение

Таблица ContactTags

  • ContactId
  • TagId

Затем я сгенерировал объекты POCO из файла * .edmx, взаимодействуя с основанным на DbContextконтекст сущностей, скрывающий таблицу ContactTags, так что связь между сущностями Contact и Tag моделируется как связь «многие ко многим».Затем я ограничил доступ к необработанному свойству навигации Contact.Tags, установив его внутренним, а не общедоступным, и выставил коллекцию ReadOnlyCollection, которую можно использовать за пределами уровня домена для отображения тегов, но ограничив операции с данными в коллекции контактом.Метод .EditTags ().

После написания кода пользовательского интерфейса для отображения списка тегов в контакте я обнаружил, что свойство навигации по тегам не загружается с отложенной загрузкой.После того, как я почесал голову и немного погуглил, я обнаружил еще один вопрос в EF CTP4 «Ленивая загрузка не играет в мяч» , который соответствовал моей проблеме.Автор вопроса обнаружил, что когда он изменил внутреннее свойство как общедоступное, оно начало работать, и, конечно же, это то же самое, что случилось со мной - я изменил свойство навигации по тегам на общедоступное, и теперь оно работает.

Мне неудобно это с точки зрения моделирования объектов / инкапсуляции данных, так как пользовательскому интерфейсу не следует предоставлять доступ к необработанной коллекции тегов, которая позволила бы коду контроллера вызывать Tags.Add (), Tags. Удалить и т. Д.

Кто-нибудь знает, является ли это ошибкой или преднамеренным решением команды EF?Можно ли получить свойство внутренней навигации быть загруженным с отложенной загрузкой?Я знаю, что мы могли бы загрузить, но мы хотели бы избежать этого, если это вообще возможно.

1 Ответ

4 голосов
/ 03 мая 2011

Ленивая загрузка в POCO требует создания прокси POCO. Прокси создаются только тогда, когда классы модели удовлетворяют определенным требованиям. Вот одно из следующих требований для прокси, которые разрешают отложенную загрузку:

Каждое свойство навигации должно быть объявлен как публичный , виртуальный (Переопределяется в Visual Basic), а не запечатанный (не переопределяемый в визуальном Basic) получить аксессор.

Цитата отсюда: http://msdn.microsoft.com/en-us/library/dd468057.aspx

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