воскресенье, 25 января 2009 г.

SQL Server Compact 3.5 + LinqToSql

Суть проблемы:
  Мост Linq to SQL имеет поддержку SQL Server CE но напрямую из Visual Studio подключение невозможно, появляется сообщение типа: "Данный тип БД не поддерживается"

Решение:
  Данная неприятность заставляет искать обходные пути, которые, в свою очередь являют собой не самый прямой путь к цели, итак-
1) Создаем базу в SQL Server Compact. Это можно сделать напрямую из окна Server Explorer(Обозреватель серверов) в Visual Studio, и заполнить базу таблицами и связями (если таковые необходимы) между ними, данную операцию можно провести как из Server Explorer, так и с помощью SQL Sever Management Studio (Она бесплатна, ссылки есть в гугле).
2) Тут нам придется обратиться к консоли. Открываем Visual Studio Command Prompt и идем в папку с базой, например E:\ cd e:\data\compact . Вводим комманду sqlmetal чтобы посмотреть на список параметров, если вам на это плевать то сразу вводим следующее sqlmetal /dbml:YourWordDataContext.dbml yourbase.sdf после чего в папке с базой появится файл yourworddatacontext.dbml . Также sqlmetal способен из полученного файла сгенерировать исходный код, но так как мы используем VisualStudio, то необходимости такой не имеем.
3) Суем ручки туда, куда микрософт не рекомендует. Открываем наш проект, требующий базу, и добавляем к нему с помощью команды Add existing item наш файл. И замечаем что студия сама без лишних разговоров генерирует исходный код для контекста данных (именно поэтому мы не стали генерировать его в sqlmetal). Добавляем в проэкт файл базы, отказываемся от создания DataSet, хотя я лично не отказывался, а просто потом удалил его в Solution Explorer'е. Собираем проект, чтобы Visual Studio блестнула своим AI и добавила  ConnectionString в настройки проекта. И вот тут, дабы привести внешний вид кода, который мы будем писать к виду кода из учебников, мы делаем идем на тёмную сторону: лезем в Solution explorer и щелкаем по + рядом с нашим dbml файлом, чтобы явить на свет божий файл с названием YourWordDataContext.designer.cs  ищем там строки типа :

   public YouкStuffDataContext(string connection) : 
base(connection, mappingSource)
{
OnCreated();
}
public YourStuffDataContext(System.Data.IDbConnection connection) : 
base(connection, mappingSource)
{
OnCreated();
}

И вписываем туда вот такое:

         public YourStuffDataContext() :  base(global::YourApp.Properties.Settings.Default.YourStuffDataContextConnectionString, mappingSource)
        {
            OnCreated();
        }

И все! Дале мы спокойно пишем свой код, забыв, что используем официально не поддерживаемый дизайнером студии "сервер БД"

ЗЫ Рекомендации микрософта соблюдать все таки стоит