Платформенным уровнем доступа к базе есть встроенный в.net 3.5 – Linq to Sql. Linq to Sql – это one-to-one table mapper, тоесть работает он достаточно просто. Подключившись к серверу Sql, он получает метаданные структуры таблиц, на их основе создаёт xml файл с расширением dbml. Это промежуточный файл, содержащий дополнительную абстракцию, где можно производить например переименование таблиц. Затем существуют утилиты генераторы, создающие на основании dbml, cs классы с аттрибутами. Одним из классов, есть расширение класса DataContext, который относительно ADO.NET 2.0, являеться чем-то близким к симбиозу DataSet и DataAdapter. Он загружает данные, в форме сгенерированных классов абстракций таблиц, измененяя любые из них, мы производим трассировку изменений, что используеться при сохранении в автоматическом режиме. Также контекст отвечает за транзакции, логирование действий, конкурентные запросы.
Относительно особенностей веб-приложений: контекст не имеет смысла хранить дольше одного реквеста, наоборот это может приводить к неожиданным ошибка. Тоже и с хранением состояния. По сути, дилема заключаеться в том, какое количестве записей можно было бы провести в виде одной операции с базой. Большее количество значительно эффективней, против меньшего количества одновременных операций. Зато соответственно меньше разрозненных записей, меньше проблем с устаревшими, не добавленными данными, которых будут ожидать другие пользователи и правильностью последовательности ввода зависимых записей.
|
|
Схема доступа
Опытным путём на данный момент я пришёл к выводу что оптимальным путём управления базой есть следующие несколько принципов:
1. Использовать HttpContext.Current.Context для хранения текущего контекста.
2. В Ctx создаётся singletone Model, через который идёт доступ к базе всем приложением. Описывается на Рисунок 2.4
3. Вместо стандартной схемы Рисунок 2.5, используется Рисунок 2.6.
4. Бизнес логика прописывается как методы partial классов от объектов.
public static MedData Model { get { if (HttpContext.Current.Items["Data_Context_Complaint"] == null) { HttpContext.Current.Items["Data_Context_Complaint"] = new MedData(); } return (MedData)HttpContext.Current.Items["Data_Context_Complaint"]; } } |
Рисунок 2.4 – Singletone доступа к базе
using(var ctx = new DataContext()) { User user = new User { Name = name } ctx.Users.InsertOnSubmit(user); ctx.Users.SubmitChanges(); } |
Рисунок 2.5 – Вариант использования контекста
User user = new User { Name = name } Ctx.Model.Users.InsertOnSubmit(user); Ctx.Model.Users.SubmitChanges(); |
Рисунок 2.6 – Вариант использования контекста, с Singletone (Рисунок. 2.4)