Использование ADO.NET Data Services и SQL Compact

На этот раз мы с вами посмотрим каким образом можно работать с данными из SQL Compact поверх ADO.NET Data Services.

Важное замечание. На самом деле, SQL Compact не совсем правильно использовать совместно с ADO.NET Data Services. Дело в том, что SQL Compact изначально не ориентирован на режим многопользовательской работы и предназначен для других целей – для использования в качестве локального хранилища. Использование SQL Compact в качестве хранилища данных в данном случае может отрицательно сказаться на производительности вашего веб-сервиса.

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

  1. Создаем, собственно, сам файл данных SQL Compact. Для этого можно воспользоваться либо средствами Visual Studio, либо сделать это, используя SQL Management Studio;
  2. Определиться уровнем доступа данных – какую технологию будем использовать. Как вариант, можно использовать ADO.NET Entity Framework или LINQ to SQL. Если используем последнюю, то генерируем модель данных используя утилиту SQLMetal, добавляем явное указание первичных ключей и, если это необходимо, добавляем реализацию IUpdatable;
  3. Создаем веб-сервис;
  4. Видим ошибку о том, что невозможно инстанциировать класс модели данных. Дело в том, что LINQ to SQL модель для файлов данных SQL Compact не имеет конструктора по умолчанию (без параметров). Поэтому переопределим метод CreateDataSource() у веб-сервиса, в котором явно создадим новую модель данных, в конструкторе которой передадим строку подключения;
  5. Запустим веб-сервис и увидим ошибку о том, что использовать SQL Compact в данном случае очень не хорошо. Согласимся с этим утверждением, еще раз подумаем действительно ли нам это так необходимо, осознаем все последствия и, если мы до сих пор решительно настроены использовать SQL Compact, настроим среду для возможности использования последнего. Для этого в какой-то начальный момент времени (например, в момент Application_Start) необходимо соответствующим образом сконфигурировать среду исполнения.
AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting", true);

Удобнее всего это сделать в файле Global.asax, в котором как раз можем создать обработчик данного события.

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting", true);
    }

    //...

Теперь наш сервис может работать поверх данных на базе SQL Compact и даже изменять эти данные.