Можно ли получить какие-либо элементы базы данных в виде набора запрашиваемых классов с EF? - PullRequest
1 голос
/ 24 августа 2009

Я пытаюсь создать приложение, в котором как разработчику, так и конечному пользователю разрешено извлекать данные из реляционной БД (выбранной во время выполнения) вообще без написания какого-либо кода SQL (и, предпочтительно, без объединения строк при взаимодействии с база данных). Цель приложения - две вещи: GUI для построителя дерева выражений и XML-сериализация сгенерированных им деревьев.

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

Итак, мои вопросы:

  1. Возможно ли использование только строки соединения во время выполнения, чтобы иметь возможность создавать объектную модель и обращаться к элементам БД в наборах - например, список всех таблиц, представлений, функций и sprocs

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

  3. Можно ли использовать класс Metadata Workspace и ItemCollections для извлечения этих списков из базы данных, содержащей только файлы CSDL, SSDL и MDL (но без классов Entity)?

  4. Могу ли я использовать LINQ to XML для сериализации результатов дерева выражений, или мне придется использовать какую-то другую технологию сериализации, специфичную для Entity Framework? (Как в примере, показанном здесь: http://msdn.microsoft.com/en-us/library/bb738528.aspx)

PS: Вот некоторые заметки из моих исследований: 1. Например, метод DataContext.GetTable () (да, слабо типизированный, а не универсальный) не извлекал никаких данных, когда DataContext получал только строку подключения.

  1. Я вызываю инструмент EdmGen для генерации артефактов схемы, и до сих пор я прочитал их атрибуты, но я все еще пытаюсь получить какой-то список элементов, которые можно использовать в лямбде выражение (например, таблицы)?

  2. Если я правильно понял, в Entity Framework я могу использовать такие классы, как рабочая область метаданных и ItemCollections вместе с инструментом EdmGen, чтобы создать необходимый набор объектов, с помощью которого можно представить концептуальную схему как объект модель в приложении.

Я просматривал руководство по программированию Entity Framework по другим связанным темам здесь и на MSDN, но пока не нашел никакой информации, относящейся к этому сценарию. Вчера я получил книгу "Programming Entity Framework", и я надеюсь, что некоторые ответы лежат в ней. Я обновлю этот вопрос, если найду какие-либо подсказки.

Итак, растерянный и все еще ищущий, заранее благодарю за любую помощь по этому вопросу.

С уважением, Борислав

Ответы [ 2 ]

1 голос
/ 06 сентября 2009

Еще раз большое спасибо Дейву за публикацию его мыслей по этому вопросу.

Вот краткий обзор моих исследований на данный момент:

Я отказываюсь от LINQ to Entities в пользу LINQ to SQL - похоже, мне будет легче с этим проектом.

Итак, вот мои вопросы, ответы и комментарии, которые у меня есть до сих пор:

  1. Возможно ли использовать только строку подключения во время выполнения, чтобы возможность создавать объектную модель и обращаться к элементам БД в наборах - например, список всех таблицы, представления, функции и sprocs?

@ Дейв - на самом деле это своего рода возможно - я взглянул на раздел «Как работает LINQPad» на официальном сайте LINQPad, и получил ответ: генерируйте классы во время выполнения, используя Reflection.Emit, чтобы создать след в памяти методов, свойств и их атрибутов, а затем создавать классы на их основе. Кроме того, я иду этот совет от модератора на MSDN: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/471c8672-0a77-4186-b1d3-844abd8a822b Таким образом, я думаю, что можно получить объектную модель во время выполнения.

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

3.Могу ли я использовать класс Metadata Workspace и ItemCollections по порядку чтобы получить эти списки из база данных, имеющая только CSDL, SSDL и файлы MDL (но без классов сущностей)?

Полагаю, я не задал здесь правильный вопрос - я хотел сказать следующее: Во время выполнения вы знаете, что существует таблица Table со столбцами Col1, Col2 и Col3. В простом приложении LINQ to SQL код будет

Table.Select(t => t.Col1, t.Col2, Col3)

Однако я ищу это: пользователь выбирает, какие столбцы участвовать в выборе, поэтому окончательный выбор будет выглядеть примерно так:

foreach(String UsersChosenColumn in TableColumnsArray)
   XDocumentXElement(UsersChosenColumn, (Table.Select(t => t.TableColumnsArray[UsersChosenColumn]))

Однако этого нельзя сделать, потому что выяснить имя столбца недостаточно - знание типа столбца - это то, что может выполнить работу. Я смотрю на это прямо сейчас, но только с точки зрения LINQ to SQL, а не LINQ to Entities - там может быть другая логика.

@ Дейв: Вот сценарий для проекта: Пользователь хочет получить XML на следующих данных: Orders.Name, Order.Price, Orders.Products.Name, Orders.Products.Manufacturer Где Orders.OrderID = 1234.

Вот что должно быть на выходе:

<Order>
 <Name>Some Order Name</OrderName>
 <Price>Some Price</Price>
  <Products>
   <Product>
     <Name>Some Product Name</Name>
     <Manufacturer>Shady Company Inc</Manufacturer>
   </Product>
   <Product>
     <Name>Some Product Name 2</Name>
     <Manufacturer>Another Company (TM)</Manufacturer>
   </Product>
  </Products>
</Order>

Поскольку я уже поместил теги EF в этот вопрос, я закрою его, так как теперь я ищу ответы LINQ to SQL, а не EF.

Если я спрошу другие очереди об этой теме, я попытаюсь прикрепить к ней подходящие теги LINQ to SQL.

Всего наилучшего, Борислав.

0 голосов
/ 26 августа 2009

Эти вопросы сложны для теории и легки в применении, что затрудняет понимание того, чего вы пытаетесь достичь. Вот мои лучшие ответы, основанные на том, что я могу понять из ваших вопросов. Если вы уточните, какие у вас требования, я могу их уточнить.


1: Это звучит как «Может ли моя Entity Model автоматически генерироваться во время выполнения со строкой соединения, включающей все мои объекты базы данных?»:

Нет. Ваша Entity Model определяется вашей Entity Data Model (например, MyModel.edmx.). Она используется для генерации класса Object Services, MyModelEntities. Модель должна существовать и быть доступной, чтобы поставщик Entity Framework мог выполнять запросы к ней.

2: Если под «деревом выражений» вы подразумеваете лямбда или синтаксис LINQ:

Любой объект коллекции, который реализует IEnumerable, IQueryable или другие подобные интерфейсы, может быть запрошен с использованием синтаксиса LINQ (from i in EntitySet... select i) или лямбда (.Where(x=>x.Id == 5)).

3: Если вы имеете в виду, можете ли вы использовать определение EDM (CSDL, SSDL, MDL) для непосредственного запроса к базе данных:

Вот что делает LINQ to Entities: переводит запросы LINQ в запросы SQL. Зачем вам изобретать L2E-провайдера?

4: В EF v1 сериализация сущностных объектов немного странная (читай: неработающая). Объекты Entity поставляются с большим количеством багажа EF (они происходят от EntityObject и несут дополнительные свойства), поэтому сериализация может быть затруднена. Насколько хорошо это работает для вас, будет зависеть от ваших объектов сущностей и от того, что вы будете делать с ними после их сериализации.

...