Технология LINQ to SQL в многоуровневых приложениях с веб-службами
Обновлен: November 2007
Технология LINQ to SQL специально предназначена для использования на среднем уровне слабо связанного компонента DAL, такого как веб-службы. Если уровнем представления данных является веб-страница ASP.NET, то для управления передачей данных между пользовательским интерфейсом и LINQ to SQL на среднем уровне используется серверный веб-элемент управления LinqDataSource. Если уровень представления данных не является страницей ASP.NET, то и на среднем уровне, и на уровне представления данных необходимо выполнить дополнительные действия по управлению сериализацией и десериализацией данных.
Настройка технологии LINQ to SQL на среднем уровне
Средний уровень веб-службы или многоуровневого приложения содержит контекст данных и классы сущностей. Эти классы можно создать вручную либо с помощью программы SQLMetal.exe или конструктора Сред. Объектно-реляционный конструктор, как описано в документации. Во время разработки можно сделать класс сущностей сериализуемым. Дополнительные сведения см. в разделе Как обеспечить сериализацию сущностей (LINQ to SQL). Другой способ заключается в создании отдельного набора классов, инкапсулирующих данные, которые необходимо сериализовать, и последующем проецировании данных в эти сериализуемые типы при их возвращении в запросах LINQ.
Затем следует определить интерфейс с методами, которые клиенты будут вызывать для извлечения, вставки и обновления данных. Методы интерфейса заключают запросы LINQ в оболочку. Для обработки удаленных вызовов методов и сериализации данных можно использовать любой вид механизма сериализации. Единственное требование заключается в том, что если в объектной модели существуют циклические или двунаправленные отношения, например между классами "Customers" и "Orders" в стандартной объектной модели "Northwind", то необходимо использовать сериализатор, который поддерживает такие отношения. Сериализатор Windows Communication Foundation (WCF) DataContractSerializer поддерживает двунаправленные отношения, а сериализатор XmlSerializer, который используется для веб-служб, не совместимых с WCF, не поддерживает. Если используется сериализатор XmlSerializer, необходимо убедиться, что в объектной модели отсутствуют циклические отношения.
Дополнительные сведения о технологии Windows Communication Foundation см. в разделе Введение в разработку служб Windows Communication Foundation в Visual Studio.
Реализуйте бизнес-правила и другую логику, относящуюся к домену, используя разделяемые классы и методы в классе DataContext и классах сущностей для обработки событий LINQ to SQL времени выполнения. Дополнительные сведения см. в разделе Реализация бизнес-логики (LINQ to SQL).
Определение сериализуемых типов
Клиент или уровень представления данных должен иметь определения типов для классов, которые он будет получать от среднего уровня. Данные типы могут сами быть классами сущностей или представлять собой особые классы, которые включают только определенные поля из классов сущностей для удаленного взаимодействия. В любом случае технология LINQ to SQL совершенно не зависит от способа получения уровнем представления данных определений этих типов. Например, уровень представления данных может использовать технологию WCF для автоматического создания типов, содержать копию библиотеки DLL, в которой определены эти типы или определить собственные версии типов.
Извлечение и вставка данных
Средний уровень определяет интерфейс, указывающий, как уровень представления данных получает доступ к данным. Например, GetProductByID(int productID) или GetCustomers(). На среднем уровне тело метода обычно создает новый экземпляр класса DataContext и выполняет запрос к одной или нескольким своим таблицам. Затем средний уровень возвращает результат в виде интерфейса IEnumerable<T>, где T является классом сущностей или другим типом, используемым для сериализации. Уровень представления данных никогда не отправляет переменные запроса непосредственно на средний уровень и не получает этих переменных из среднего уровня. Оба уровня обмениваются значениями, объектами и коллекциями конкретных данных. После получения коллекции уровень представления данных при необходимости может использовать технологию LINQ to Objects для выполнения запроса к этой коллекции.
При вставке данных уровень представления может создать новый объект и отправить его на средний уровень или указать среднему уровню создать объект на основе предоставленных им значений. В общем случае извлечение и вставка данных в многоуровневых приложениях не сильно отличается от аналогичного процесса в двухуровневых приложениях. Дополнительные сведения см. в разделах Выполнение запросов к базе данных (LINQ to SQL) и Внесение и отправка изменений данных (LINQ to SQL).
Отслеживание изменений для обновления и удаления
Технология LINQ to SQL поддерживает оптимистический параллелизм, основанный на отметках времени (также называемых RowVersions) или на исходных значениях. Если таблицам базы данных присвоены отметки времени, то для операций обновления и удаления требуются некоторые дополнительные действия либо на среднем уровне, либо на уровне представления данных. Однако если для проверок на оптимистический параллелизм необходимо использовать исходные значения, то ответственность за отслеживание этих значений и отправку их обратно при выполнении обновлений лежит на уровне представления данных. Причиной этого является тот факт, что изменения сущностей, выполненные на уровне представления данных, не отслеживаются на среднем уровне. В действительности, исходное извлечение сущности и окончательное его обновление обычно выполняется двумя совершенно различными экземплярами класса DataContext.
Чем больше количество изменений, выполненных на уровне представления данных, тем сложнее становится отслеживать эти изменения и отправлять их в пакетах обратно на средний уровень. Реализация механизма передачи изменений полностью зависит от приложения. Единственное требование заключается в том, что технологии LINQ to SQL должны быть предоставлены исходные значений, которые необходимы для выполнения проверок на оптимистический параллелизм.
Дополнительные сведения см. в разделе Получение данных и операции CUD в многоуровневых приложениях (LINQ to SQL).
См. также
Основные понятия
Многоуровневые и удаленные приложения с LINQ to SQL
Общие сведения о серверном веб-элементе управления LinqDataSource