2011-01-25 3 views
0

Я создал DLL в Visual Studio, которая содержит мою Entity Framework ObjectContext. Я пытаюсь получить доступ к его различным ObjectSet s от PowerShell. Я делаю это, потому что у меня есть некоторые файлы XML, которые я извлекаю из веб-службы, и я хотел бы использовать функции xml PowerShell (автоматическое генерирование свойств, нефатальная оценка $ null) для сопоставления входящих xml-значений с Entities вместо необходимости использования классов C# Xml. В основном мой сценарий PowerShell является загрузчиком данных.Entity Framework ObjectSet в Powershell

Я могу создать и создать экземпляр объекта ObjectContext просто отлично. Я вижу все свойства, используя $myObjectContext | Get-Member -MemberType Property. Тем не менее, у меня возникли проблемы с пониманием того, когда именно объекты возвращаются из запросов в ObjectSet.

Я знаю, что в Linq-to-Entities существует ленивая загрузка, и эти объекты загружаются только при перечислении коллекции. Я пробовал вызывать метод эксленизации, но похоже, что PowerShell не поддерживает поддержку выражения лямбда.

Вот мой вопрос. Как узнать, когда мои запросы будут явно перечислены? Например, вот одно из свойств (определено как ObjectSet<VehicleType> VehicleTypes {get;}).

PS> $myObjectContext.VehicleTypes

Выдает следующую ошибку, которую я буду помечать, как (TheError) для дальнейшего использования:

format-default : Exception has been thrown by the target of an invocation. + CategoryInfo : Not Specified: (:) [format-default], TargetInvocationException + FullyQualifiedErrorId : System.Reflection.TargetInvocationException

НО, PS> $myObjectContext.VehicleTypes | Select-Object VehicleTypeID

производит правильный вывод (стол идентификаторов транспортного средства)

Однако PS> $myObjectContext.VehicleTypes | Select-Object * дает TheError, как описано выше.

PS> $myObjectContext.VehicleTypes | Sort-Object всегда, кажется, перечислил коллекцию, что понятно, поскольку для ее сравнения необходимо рассмотреть все элементы.

Следует отметить, что после того, как коллекция была перечислина один раз, вызов PS> $myObjectContext.VehicleTypes НЕ дает TheError выше - она ​​отображает коллекцию точно так же, как и вы. Это действительно странно, но я думаю, что это имеет какое-то отношение к ленивой загрузке (вот почему я упомянул об этом выше).

Может ли кто-нибудь подтвердить или объяснить это поведение мне и, возможно, дать мне несколько указаний на рекомендации по использованию Entity Framework с PowerShell?

Кроме того, если я сделаю что-то вроде PS> $myObjectContext.VehicleTypes | Where-Object {$_.VehicleTypeID -eq $vehicleTypeId}, он будет достаточно умным, чтобы выполнить эту сторону сервера запросов, или он собирается извлечь все записи из БД и вернуть только тот, который я ищу. Если ситуация последняя, ​​я думаю, что я мог бы застрять в использовании C# (с его не очень-дружественным синтаксисом xml) для доступа к данным.

+1

Из любопытства, что произойдет, если вы запустите это: «$ myObjectContext.VehicleTypes | write-host» против этого: «$ myObjectContext.VehicleTypes | out-host» – beefarino

+0

$ myObjectContext.VehicleTypes | Write-Host не создает ошибку выше. Вместо этого он будет записывать тип каждого объекта (фактически полное пространство имен и набирать что-то вроде MyNamespace.VehicleTypes) на экран вместо фактических значений объекта. $ myObjectContext.VehicleTypes | Out-Host создает ошибку, как описано выше. Спасибо за совет. –

ответ

1

Я могу сказать вам, что перечисление выполняется с помощью этого кода: PS> $myObjectContext.VehicleTypes | Where-Object {$_.VehicleTypeID -eq $vehicleTypeId} - это все клиентская сторона.

Если вы хотите выполнить собственную фильтрацию, вам необходимо создать командлет для доступа к данным или поставщика, который поддерживает собственные фильтры.

+0

Я боялся, что все это происходит на стороне клиента, и после вашего комментария и издевательства через него, это имеет смысл. Причина, по которой запросы возникают на стороне сервера с Linq, заключается в том, что MS построила Linq-to-Entities, которая создает пользовательские выражения для выполнения на стороне сервера. –

+0

Пытался отредактировать мой комментарий выше, но прошло 5 минут. В любом случае, позвольте мне уточнить, что я пытался сказать. Я понимаю, что запросы причин происходят на стороне сервера с Linq-to-Entities, потому что API строит настраиваемые выражения и деревья выражений, которые оценивают и сводят к соответствующим SQL-строкам, которые выполняются на стороне сервера. –

+0

, основанный на вашем эксперименте с файлом write-host/out-host, это определенно что-то внутри подсистемы форматирования powershell. обязательно зарегистрируйте его на connect.microsoft.com/PowerShell – beefarino

0

Немного поздно, я понимаю, но TheError может быть вызван тем, что powershell.exe работает .net v2.0. См. Cmo999's answer, и мои собственные аналогичные question.

Возможно настроить powershell.exe для запуска под .net 4.0 путем добавления/изменения powershell.exe.config, как описано cmo999 в приведенной выше ссылке.

Смежные вопросы