Проблема, связанная с Entity Framework - PullRequest
0 голосов
/ 02 сентября 2010

Я только начинаю работать с Entity Framework. Проблема, с которой я сталкиваюсь, заключается в том, что это ORM, который моделирует все как объекты реального мира. Следовательно, если я получаю родительскую запись, ее дочерние записи выбираются автоматически. Если у меня есть 1000 записей о детях, все они извлекаются, хотя в данный момент они мне могут и не понадобиться. Это я считаю очень неэффективным.

Вы бы посоветовали использовать Lazy Loading в Linq и таким образом решить проблему, чтобы sql не отправлялся на SQL Server до тех пор, пока к нему не будет получен доступ. Но что, если я работаю в веб-сервисе или в среде WCF? В веб-сервисах мы видим модель ответа на запрос. И, как я знаю, мы не можем использовать отложенную загрузку в веб-сервисах, потому что веб-сервисы не будут вызываться на лету при доступе к этому свойству: d.

Скажите, у меня есть order и orderDetails таблица. В некоторых случаях я хочу orderDetails, как только я получаю заказ, а в других я не хочу orderdetails.

Я никогда не сталкивался с этой проблемой при использовании хранимых процедур. Но поскольку Linq является стандартным средством для запроса любых данных, я попал в его руки.

Итак, как мне решить эту проблему?

Заранее спасибо:)

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Прежде всего, даже с Entity Framework, вы можете полностью использовать хранимые процедуры для выполнения запросов - нет проблем.

Далее - если вам иногда нужны детали заказа с вашим Order, а иногдау вас нет - какой-то параметр указывает это - что-то вроде:

[OperationContract]
Order FetchOrder(int OrderID, int numDetails);

Если numDetails = 0, вы не получаете никаких данных и не возвращаете никаких данных - если у вас есть numDetails = 10,Вы получаете и возвращаете первые десять деталей заказа.Вы можете определенно сделать это в Linq-to-Entities.

В этом случае вам, вероятно, также понадобится какая-то операция для получения более подробной информации, если это необходимо.

Iне думайте, что здесь есть какая-то архитектурная проблема - вам просто нужно переосмыслить и, возможно, переработать ваши собственные сервисные контракты, чтобы справиться с этим сценарием, иногда загружая детали, а иногда нет.

0 голосов
/ 02 сентября 2010

Существует несколько способов осуществления предварительной выборки (загрузка вперед).

Ознакомьтесь с ADO .NET Data Services и, в частности, с его поддержкой в ​​качестве IExpandProvider (который позволяет указать, какие связанные сущности вы хотите получить авансом для отправки обратно клиенту WCF): http://msdn.microsoft.com/en-us/library/cc907912.aspx

Если вы ДЕЙСТВИТЕЛЬНО хотите идти по ленивому маршруту загрузки (даже в сценарии с удаленным клиентом), я реализовал это в прошлом, используя Castle или Unity (также могли бы работать mocking frameworks) для создания динамических прокси, которые переопределяли свойства на моем объекте и, если они используются в удаленном сценарии, фактический доступ к свойству делает последующий вызов WCF, чтобы выйти и извлечь связанный объект (ы). Это оказывает довольно большое влияние на производительность из-за нескольких удаленных вызовов, и я избегаю использовать эту функцию, за исключением случаев, когда речь идет о динамически скомпилированных фрагментах кода.

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