Entity Framework ObjectSet в Powershell - PullRequest
0 голосов
/ 25 января 2011

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

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

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

Вот мой вопрос. Как я узнаю, когда мои запросы будут явно перечислены? Например, вот одно из свойств (определено как ObjectSet<code><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

выдает правильный вывод (таблица идентификаторов VehicleTypeID)

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 26 января 2011

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

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

0 голосов
/ 01 апреля 2014

Немного поздно, я понимаю, но TheError может быть из-за powershell.exe под управлением .net v2.0. См. ответ cmo999 и мой аналогичный вопрос .

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

...