Генерация LINQ к DB2?

У меня есть существующая база данных 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 поставщику DB2! Это довольно просто на данный момент и очень специализировано для нашей среды, таким образом, никакие планы внести его назад в проект все же. Но надо надеяться я смогу стать зрелым свое ветвление со временем и передать его обратно.Спасибо!

9
задан David 9 August 2010 в 09:45
поделиться

5 ответов

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

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

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

Важно не пытаться получить абсолютно все, что получил 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 to something libs), что означает, что если модификации производной DataContext недостаточно, вы можете взять на себя и все выражения LINQ.

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

3
ответ дан 3 November 2019 в 07:46
поделиться

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

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

И nhibernate, и Entity framework поддерживают работу LINQ без каких-либо проблем.

Thanks

Simon

1
ответ дан 3 November 2019 в 07:46
поделиться

Я не специалист по DB2, но вот несколько идей, которые вы могли или не видели.

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

Удачи!

0
ответ дан 3 November 2019 в 07:46
поделиться

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

  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 Entity model - edmx файл для вашей базы данных.

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

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

0
ответ дан 3 November 2019 в 07:46
поделиться

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

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

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

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

0
ответ дан 3 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: