Генерация LINQ для DB2? - PullRequest
       51

Генерация LINQ для DB2?

9 голосов
/ 20 июля 2010

У меня есть база данных DB2 на моей работе.(По крайней мере, я думаю, что это DB2. Они называют его «iSeries», и он выглядит и ощущается как DB2 на некотором оборудовании для мэйнфреймов.) В течение многих лет разработчики .NET в моем отделе просто писали команды и запросы ADO вручнуюполучать конкретные данные из определенных таблиц и т. д.

В настоящее время я создаю некоторую инфраструктуру, которая поможет упростить разработку и поддержку нашего внутреннего программного обеспечения, и я хотел бы решить одну из этих проблем:доступ.Я немного новичок в различных инструментах ORM, но я знаком с синтаксисом LINQ, и это то, что я хотел бы получить.Вот что мы имеем сейчас:

  1. Созданная база данных DB2 с множеством таблиц.
  2. Нет установленных бизнес-объектов в коде.
  3. Нет полезных отношений между таблицами илюбые потенциальные бизнес-объекты.

Итак, я пытаюсь создать слой абстракции между кодом и базой данных DB2, где разработчики могут по существу делать то, что они уже делают (собирать данные и заполнятьпользовательский объект) просто более бегло и качественно.То есть вместо создания классических объектов ADO и заполнения DataSet просто напишите простой оператор LINQ, который возвращает анонимный IQueryable с полями для заполнения пользовательского объекта.(В качестве дополнительного бонуса мне очень нравится идея ошибок во время компиляции, когда программисты путают что-то вместо ошибок во время выполнения, как это происходит, когда опечатка пробивается в литерал командной строки SQL. Кроме того, даже не поймите меняздесь начали использовать уязвимости SQL-инъекций.)

Дело в том, что я пока не смог найти какой-либо способ сделать это.Вполне возможно, что я упускаю из виду что-то простое, и если это так, то я приветствую небольшой толчок в правильном направлении.Но все, что я нахожу в Интернете, вписывается в одну из следующих категорий:

  1. Да, вы можете сделать это!Все, что вам нужно, это драйвер от IBM, для которого нет ссылки на скачивание!
  2. Вот полезное руководство по созданию отличного ORM для ваших бизнес-объектов, которое создает базу данных с нуля.(В основном NHibernate, который было бы здорово использовать, если бы я мог использовать его для того, что я пытаюсь сделать.)
  3. Загрузите какой-нибудь инструмент и сгенерируйте ваш ORM.(Инструмент не поддерживает DB2 или утверждает, что не работает, когда я пытаюсь.)

Кто-нибудь сталкивался с чем-то подобным раньше?Я подхожу к этому совершенно неправильно?Спасибо за любые советы по этому вопросу, спасибо.

Редактировать: Я собираюсь пойти дальше и щедро наградить этот.Я разговаривал с некоторыми людьми, и звучит так, будто «это еще не сделано» - все еще готовый ответ, но если кто-нибудь поработал над этим и нашел решение, я бы хотел услышать это.

Обновление: благодаря ответу ниже за указание на проект DB_Linq.На самом деле мне не потребовалось много времени, чтобы добавить к этому базовую поддержку DB2, и теперь у меня есть проверенный и работающий поставщик LINQ to DB2!На данный момент это довольно просто, и очень настроено для нашей среды, поэтому пока не планируется вносить его обратно в проект.Но, надеюсь, со временем я смогу вырастить свою вилку и отправить ее обратно.Спасибо!

Ответы [ 6 ]

3 голосов
/ 02 августа 2010

Если вы не решительно настроены заняться кодированием :-), получив LINQ to MySql, Oracle и Postgress и изменив его, вы, вероятно, также сэкономите вам много работы.Помните, что LINQ to SQL по-прежнему использует то же соединение ADO.NET.

Имейте в виду, что LINQ to Entities не совпадает с LINQ to SQL, и даже если вы работаете с этой библиотекой IBM, вам сначала нужно проверить,вам будет разрешено использовать его против существующей БД без особых проверок (он может легко отключиться и попытаться изменить существующую БД - проверьте этот поток, если вы хотите вникнуть в этот аспект: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/f3a5b27a-5b73-476a-8c38-1eaedc8f197c).

Вы также можете перейти к Бета-поток IBM Entity Framework (начните с конца, где некоторые люди заявляли о результатах работы).

Важно не пытаться получить абсолютно все, что MS SQLполучил - вам просто нужны классы представления таблиц, и вы готовы пойти на первый раунд.

Еще одна вещь, которую вы можете попробовать, - это открыть обычное соединение ADO.NET с DB2 (или принудительно установить ODBC, если выяснится, чтоне-ODBC-соединение слишком шпионское и чувствительное) к DB2, и попробуйте действовать так, как если бы это был SQL Server. Если окажется, что SqlMetal согласен работать с этим соединением, которое вы в значительной степени сделали - оно автоматически сгенерирует классы представления таблиц для вас.

Если оно будет блокироваться, вам также потребуется MS SQL Server, по крайней мере, для целей разработки.Для сценария запуска из нескольких таблиц из DB2 создайте затем в SQL Server, а затем запустите SqlMetal и изучите исходный код.Вы увидите, что он создает симпатичные классы кланов для представления таблиц и просто надевает на них здоровенные, но прямые атрибуты - то есть их легко копировать и вставлять или даже создавать с помощью хорошего сценария.Как только вы увидите, как выглядит маленький автоматически сгенерированный файл, вы также увидите, что вы можете прикрепить больше кода к предоставленным хукам или удалить какой-либо существующий код.Проверьте, что LINQ to MySql и т. Д. еще раз.

Самому LINQ просто нужны классы представления таблиц, так что вы будете достаточно свободны, чтобы сделать свой собственный производный System.Data.Linq.DataContext почти для вашегожелания сердца, и я полагаю, что схема в DB2 почти никогда не меняется, поэтому вам не придется менять ее слишком часто.LINQ - это довольно открытая система в целом (о чем свидетельствуют многие LINQ для чего-то libs), что означает, что если модификация производного DataContext недостаточна, вы также можете перенять все выражения LINQ.

Однаждыу вас есть подтверждение концепции с несколькими таблицами, вам может понадобиться написать сценарий perl или python (или powershell или C #), чтобы выполнить небольшую замену регулярных выражений, если сценарии создания таблиц DB2 не работают на SQL Server без изменений (всегда естьнесколько синтаксических отклонений) и вы действительно должны идти по самому неудачному маршруту.

1 голос
/ 21 июля 2010

Это мой список того, что нужно сделать, поскольку я работаю с большой системой IBM DB2 и у меня есть разработчики .net.Не так просто получить драйверы и плагины для Visual Studio 2008/2010.

ORM - я знаю (я читал), что nHibernate и Entity Framework поддерживают синтаксис DB2 SQL.nHibernate имеет большую кривую обучения, и мы не решили, будем ли мы на этом прыгать.Но структура сущностей (новая) выглядит очень хорошо и в настоящее время подходит для SQL Server 2008, но имейте в виду, что она также указывает на DB2..

Спасибо

Симон

0 голосов
/ 19 июля 2013

Вы можете использовать легкий ORM, такой как dapper-dot-net.http://code.google.com/p/dapper-dot-net/

0 голосов
/ 05 августа 2010

Решением, которое я использую в своем текущем проекте, является «Связанный сервер» в Microsoft SQL Server, который через OleDB связан с сервером баз данных DB2.

В базе данных моего проекта я создал представления, которые отражают таблицы DB2. После запуска sqlmetal.exe с параметром / views для них также будет создан файл сопоставления.

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

В моем проекте имеет смысл сделать это таким образом, поскольку мне приходится читать / записывать базы данных как на DB2, так и на SQL Server, и используя связанный сервер, я могу делать все это в одном соединении ADO.NET, фиксируя изменения в обе базы данных одновременно.

0 голосов
/ 02 августа 2010

Ну, простой ответ для вас - да, вы можете сделать. Как?

  1. Загрузите клиент сервера данных DB2 9.7 и установите его. Замените всех своих старых клиентов.

  2. Возможно, вам придется переписать строку подключения к DB2. В C: \ Program Files \ IBM \ SQLLIB \ Bin \ Testconn.exe вы сможете создать и протестировать строку подключения.

  3. Убедитесь, что ваш IBM.Data.Informix.dll находится в рабочем состоянии.

  4. Использовать VS2008. На сегодняшний день VSAI для DB2 для VS2010 еще не выпущен.

  5. Как и любая другая база данных, создайте модель сущности ADO.NET - файл edmx для вашей базы данных.

  6. Скорее всего, с большим количеством таблиц в вашей базе данных (что, скорее всего, с DB2), вы должны получить EDMGEN2.exe от www.codeplex.com. Возможно, вам придется разместить текстовый файл с именем «Tables.txt», заполненный таблицами, представлениями, именами Proceduce и именем схемы. EdmGen2.exe будет использовать этот текстовый файл и создавать файл EDMX только для указанных таблиц. Позже вы можете добавить дополнительные таблицы.

  7. У IBM есть сайт поддержки, на котором сообщается об ограничениях функций, поддерживаемых в Linq в клиенте DB2 9.7, из-за ограничений DB2 SQL.

0 голосов
/ 31 июля 2010

Я не человек DB2, но вот некоторые идеи, которые вы могли или не могли увидеть.

Надеюсь, это поможет.

Удачи!

...