Публикуем сайт с SQL Server Compact Edition 4.0

    • SQL Server
    • outcoldman.ru
    • Entity Framework
    • SQL Server Compact
    • SQL Server CE
    • SQL Server CE 4
    • Membership
  • modified:
  • reading: 5 minutes

Меня, честно, даже обрадовало то, что можно теперь разрабатывать сайты с использованием SQL Server Compact Edition 4.0. Отдельная База Данных иногда бывает провокатором проблем и ошибок: у хостера ваш сосед по БД может сильно перезагрузить сервер БД, и у вас начнется что-то отваливаться (либо хостер может перегрузить сервер БД слишком большим количеством баз данных). С SQL Server Compact Edition 4.0 наш сайт уже не зависит от внешней БД, она у нас локальная, крутится вместе с нашим приложением. Уж очень удобно забирать всегда последнюю версию файла базы данных, легко обновлять – нужно просто скопировать файл. В общем, на момент выхода статьи мой сайт будет крутиться на SQL Server Compact Edition 4.0 уже как месяц (проблем не было никаких). Рекомендую задуматься, если у вас сайт, вроде блога, небольшого онлайн магазина, о том, чтобы перевести (или разрабатывать новое) с использованием SQL Server CE 4.

Что нужно, чтобы начать работать с SQL Server Compact Edition 4.0?

Скажу честно, что изначально я потратил достаточно много времени на то, чтобы найти какую-нибудь нормальную утилиту для работы с базами данных SQL Server CE 4.0. Итак для начала, если вы еще не скачали сам SQL Server Compact Edition 4.0, то скачиваем его с download сайта. Затем, в принципе, уже можно работать с CE, только непонятно чем. Меня вот особо повеселил парень, написавший вот эту статью A Simple Guide to SQL Compact 4, он описывает то, как можно создать CE базу данных версии 4.0 на последней MS Management Studio (я даже удивился, что вот молодцы команда SQL Server, уже поддерживает новую версию CE), а ему потом намекнули о том, что работаешь то ты с 3.x версией, а не 4-ой.

Еще нашел блог Everything SQL Server Compact, автор которого опубликовал свои утилиты для работы с CE версиями БД, вот недавно даже вышла 2-я версия его утилиты для VS2010, но как нормально работать с ней я так и не понял (как таблицу-то создать?).

В общем, ничего не оставалось, как ставить себе Sevice Pack 1 Beta 1 на VS2010, так как для него уже есть SQL Compact Edition 4 Tools for VS2010 SP1 Beta, с которым хоть как-то да можно поработать. Дизайнер там, конечно, такой, к которому нужно привыкнуть. Ограничений, с которыми я столкнулся много: а) нельзя изменять нормально таблицы с типом ntext (точно не помню, но такое ощущение, что даже удалить эту колонку нельзя или добавить, если есть записи); б) нельзя для существующей int колонки добавить свойства Identity(1,1), если существуют записи; в) в дизайнере запросов если написать SELECT TOP x, то он скажет что “'TOP Clause' support not available in SqlCE.”, но если нажать Continue, то запрос выполнится. В общем, есть небольшие проблемы, будем ждать инструмента для работы с SqlCE для Management Studio, там, вроде, все получше работает. Ну, а после установки всех инструментов, можно будет в Add –> New Item… добавлять SQL Server Compact 4.0 Local Database:

SQLServerCE

У меня раньше использовался Linq2Sql совместно с Sql Server 2008 базой данных, мне нужно быстро было бы сменить репозитории, и вот с радостью узнал, что последний Microsoft ADO.NET Entity Framework Feature Community Technology Preview 5 поддерживает работу с SQL Server CE 4.0. Потому переписывать особо не много нужно было, просто поменять DataContext. Самое удивительное, что разобраться, как создать ADO.NET Entity Data Model не так просто. Я, вроде, все поставил, иду в свою библиотеку PersonalWeb.Model, чтобы создать новый Data Model, и обнаруживаю, что в списке провайдеров нет SQL Server Compact 4.0, есть только 3.5 версия. Не поверите, но создать новый ADO.NET Entity Data Model с версией провайдера SQL Server Compact 4.0 можно только в веб-проекте. Потому идем в веб-проект и создаем Data Model именно там, где уже обнаружим необходимый Data Provider (спрашивается зачем так сделано? я полчаса потратил для того, чтобы это понять):

DataSource

Дальше нужен Membership провайдер (кому-то может еще и Role-,Profile- провайдеры). Я особо не переживал, если что написал бы сам, даже уже был готов написать сам провайдер, но вовремя обнаружил готовый http://sqlcemembership.codeplex.com/ (опять же написал человек, владелец блога Everything SQL Server Compact, так что рекомендую). Поставил его, и он заработал. Единственное, у хостера пришлось поменять одну настройку для ASP.NET MVC 3, чтобы решить ошибку, которая возникала “This method cannot be called during the application's pre-start initialization stage.”, об этом я писал раньше Обновляем приложение с MVC 2 до MVC 3

Ну и на последок: хранимые процедуры (некоторые запросы мне было сложно написать на Linq) я переделал на использование метода ExecuteStoreQuery<TElement>.

В общем-то вот все и готово, вот так я и перевел проект на SQL Server CE 4, он у меня не большой конечно же, потому хватило с разбором полета, поиска утилит и т.п. в районе 4 часов.

Публикуем сайт с SQL Server CE 4.0 к хостеру

Очевидно, что вряд ли текущие хостеры поставили себе библиотеки SQL Server CE 4.0, но использовать эту версию БД все равно можно, нужно только предпринять немного действий.

Первое, нужно скопировать сами библиотеки, идем в папку

c:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Private\

Там все что есть копируем к хостеру в папку bin (со всеми подпапками):

sqlcefolder

Так же не забываем библиотеку System.Data.Entity.dll (так как мы поставили новую версию EF) - это в случае если тоже ее используете.

И последнее, нужно добавить Data Provider к хостеру в ваш web.config (в секцию configuration, как у меня):

<configuration>
 
    ...
     <system.data>
        <DbProviderFactories>
            <remove invariant="System.Data.SqlServerCe.4.0" /> 
            <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" 
                description=".NET Framework Data Provider for Microsoft SQL Server Compact" 
                type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> 
        </DbProviderFactories>
    </system.data>
</configuration>

Вроде все.

Еще раз рекомендую ознакомиться с блогом Everything SQL Server Compact, там действительно много информации по SQL Server CE.

Будут вопросы – спрашивайте, постараюсь помочь.

See Also