Я создал 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) для доступа к данным.
Из любопытства, что произойдет, если вы запустите это: «$ myObjectContext.VehicleTypes | write-host» против этого: «$ myObjectContext.VehicleTypes | out-host» – beefarino
$ myObjectContext.VehicleTypes | Write-Host не создает ошибку выше. Вместо этого он будет записывать тип каждого объекта (фактически полное пространство имен и набирать что-то вроде MyNamespace.VehicleTypes) на экран вместо фактических значений объекта. $ myObjectContext.VehicleTypes | Out-Host создает ошибку, как описано выше. Спасибо за совет. –