В предыдущей статье Сравниваем ORM для .Net - BLToolkit мы посмотрели как работать с ORM BLToolkit, в этой посмотрим какие особенности работы с ORM Dapper.NET (Dapper - a simple object mapper for .Net). В описании сказано что работа маппера практически не влияет на скорость выполнения запросов к БД, более того, на этой ORM работает StackOverflow, что только повышает наш интерес.
Итак, приступим.
Добавим в наш проект ServiceCenter DLL-проект ServiceCenter.Data.DapperNet
К проекту подключим через Nuget библиотеки Dapper, Dapper.Contrib и Dapper.Mapper
Get-Project ServiceCenter.Data.DapperNet | Install-Package Dapper -Version 1.50.1
Get-Project ServiceCenter.Data.DapperNet | Install-Package Dapper.Contrib
Get-Project ServiceCenter.Data.DapperNet | Install-Package Dapper.Mapper
Создадим классы для связи с БД: DeviceType (тип устройства), Manufacturer (производитель), Position (должность), Employee (сотрудник), Status (состояние заявки), Request (заявка)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Contrib = Dapper.Contrib.Extensions;
///<summary>
/// Тип устройства
///</summary>
[Contrib.Table("DeviceType"), DisplayName("Тип устройства"), DisplayColumn("Value")]
public class DeviceType
{
///<summary>
/// Ключ
///</summary>
[DisplayName("Id"), Contrib.Key]
public int DeviceTypeId { get; set; }
///<summary>
/// Наименование
///</summary>
[DisplayName("Наименование"),
DisplayFormat(NullDisplayText = "Наименование не может быть пустым"),
Required(ErrorMessage = "Наименование не может быть пустым"),
DataType(DataType.Text),
StringLength(50, ErrorMessage = "Максимум 50 символов")]
public string Value { get; set; }
///<summary>
/// Заявки
///</summary>
[DisplayName("Заявки"), Contrib.Computed]
public List<Request> Requests { get; set; }
}
///<summary>
/// Производитель
///</summary>
[Contrib.Table("Manufacturer"), DisplayName("Производитель"), DisplayColumn("Value")]
public class Manufacturer
{
///<summary>
/// Ключ
///</summary>
[DisplayName("Id"), Contrib.Key]
public int ManufacturerId { get; set; }
///<summary>
/// Наименование
///</summary>
[DisplayName("Наименование"),
DisplayFormat(NullDisplayText = "Наименование не может быть пустым"),
Required(ErrorMessage = "Наименование не может быть пустым"),
DataType(DataType.Text),
StringLength(50, ErrorMessage = "Максимум 50 символов")]
public string Value { get; set; }
///<summary>
/// Заявки
///</summary>
[DisplayName("Заявки"), Contrib.Computed]
public List<Request> Requests { get; set; }
}
///<summary>
/// Должность
///</summary>
[Contrib.Table("Position"), DisplayName("Должность"), DisplayColumn("Value")]
public class Position
{
///<summary>
/// Ключ
///</summary>
[DisplayName("Id"), Contrib.Key]
public int PositionId { get; set; }
///<summary>
/// Наименование
///</summary>
[DisplayName("Наименование"),
DisplayFormat(NullDisplayText = "Наименование не может быть пустым"),
Required(ErrorMessage = "Наименование не может быть пустым"),
DataType(DataType.Text),
StringLength(50, ErrorMessage = "Максимум 50 символов")]
public string Value { get; set; }
///<summary>
/// Сотрудники
///</summary>
[DisplayName("Сотрудники"), Contrib.Computed]
public List<Employee> Employees { get; set; }
}
///<summary>
/// Сотрудник
///</summary>
[Contrib.Table("Employee"), DisplayName("Сотрудник"), DisplayColumn("FullName")]
public class Employee
{
///<summary>
/// Ключ
///</summary>
[DisplayName("Id"), Contrib.Key]
public int EmployeeId { get; set; }
///<summary>
/// Имя
///</summary>
[DisplayName("Имя"),
DisplayFormat(NullDisplayText = "Наименование не может быть пустым"),
Required(ErrorMessage = "Имя не может быть пустым"),
DataType(DataType.Text),
StringLength(50, ErrorMessage = "Максимум 50 символов")]
public string Name { get; set; }
///<summary>
/// Фамилия
///</summary>
[DisplayName("Фамилия"),
DataType(DataType.Text),
StringLength(50, ErrorMessage = "Максимум 50 символов")]
public string SurName { get; set; }
///<summary>
/// Отчество
///</summary>
[DisplayName("Отчество"),
DataType(DataType.Text),
StringLength(50, ErrorMessage = "Максимум 50 символов")]
public string MidName { get; set; }
///<summary>
/// Должность
///</summary>
[DisplayName("Должность")]
public int PositionId { get; set; }
///<summary>
/// Должность
///</summary>
[DisplayName("Должность"), Contrib.Computed]
public Position Position { get; set; }
///<summary>
/// Полное имя
///</summary>
[DisplayName("Ф.И.О."), Contrib.Computed]
public string FullName
{
get
{
string fullName = this.Name;
if (!string.IsNullOrEmpty(this.SurName) && !string.IsNullOrEmpty(this.MidName))
fullName = string.Format("{0} {1}.{2}.", this.SurName, this.Name[0], this.MidName[0]);
else if (!string.IsNullOrEmpty(this.SurName))
fullName = string.Format("{0} {1}", this.SurName, this.Name);
return fullName;
}
}
///<summary>
/// Заявки
///</summary>
[DisplayName("Заявки"), Contrib.Computed]
public List<Request> Requests { get; set; }
}
///<summary>
/// Статус заявки
///</summary>
[Contrib.Table("Status"), DisplayName("Статус заявки"), DisplayColumn("Value")]
public class Status
{
///<summary>
/// Ключ
///</summary>
[DisplayName("Id"), Contrib.Key]
public int StatusId { get; set; }
///<summary>
/// Наименование
///</summary>
[DisplayName("Наименование"),
DisplayFormat(NullDisplayText = "Наименование не может быть пустым"),
Required(ErrorMessage = "Наименование не может быть пустым"),
DataType(DataType.Text),
StringLength(50, ErrorMessage = "Максимум 50 символов")]
public string Value { get; set; }
///<summary>
/// Заявки
///</summary>
[DisplayName("Заявки"), Contrib.Computed]
public List<Request> Requests { get; set; }
}
///<summary>
/// Заявка
///</summary>
[Contrib.Table("Request"), DisplayName("Заявка")]
public class Request
{
///<summary>
/// Ключ
///</summary>
[DisplayName("Id"), Contrib.Key]
public int RequestId { get; set; }
///<summary>
/// Ответственный/исполнитель
///</summary>
[DisplayName("Ответственный/исполнитель")]
public int EmployeeId { get; set; }
///<summary>
/// Ответственный/исполнитель
///</summary>
[DisplayName("Ответственный/исполнитель"), Contrib.Computed]
public Employee Employee { get; set; }
///<summary>
/// Дата приёма
///</summary>
[DisplayName("Дата приёма"),
DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "dd.MM.yyyy", NullDisplayText = "Дата приёма не может быть пустой"),
DataType(DataType.Date)]
public DateTime DateIn { get; set; }
///<summary>
/// Дата выдачи
///</summary>
[DisplayName("Дата выдачи"),
DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "dd.MM.yyyy", ConvertEmptyStringToNull = true),
DataType(DataType.Date)]
public DateTime? DateOut { get; set; }
///<summary>
/// Тип устройства
///</summary>
[DisplayName("Тип устройства")]
public int DeviceTypeId { get; set; }
///<summary>
/// Тип устройства
///</summary>
[DisplayName("Тип устройства"), Contrib.Computed]
public DeviceType DeviceType { get; set; }
///<summary>
/// Производитель
///</summary>
[DisplayName("Производитель")]
public int ManufacturerId { get; set; }
///<summary>
/// Производитель
///</summary>
[DisplayName("Производитель"), Contrib.Computed]
public Manufacturer Manufacturer { get; set; }
///<summary>
/// Модель
///</summary>
[DisplayName("Модель"),
DisplayFormat(NullDisplayText = "Название модели не может быть пустым"),
Required(ErrorMessage = "Название модели не может быть пустым"),
DataType(DataType.Text)]
public string Model { get; set; }
///<summary>
/// Описание неисправности
///</summary>
[DisplayName("Описание неисправности"),
DisplayFormat(NullDisplayText = "Описание не может быть пустым"),
Required(ErrorMessage = "Описание не может быть пустым"),
DataType(DataType.MultilineText),
StringLength(250, ErrorMessage = "Максимум 250 символов")]
public string Description { get; set; }
///<summary>
/// Ф.И.О. клиента
///</summary>
[DisplayName("Ф.И.О. клиента"),
DisplayFormat(NullDisplayText = "Ф.И.О. клиента не может быть пустым"),
Required(ErrorMessage = "Ф.И.О. клиента не может быть пустым"),
DataType(DataType.Text),
StringLength(150, ErrorMessage = "Максимум 150 символов")]
public string ClientName { get; set; }
///<summary>
/// Телефон клиента
///</summary>
[DisplayName("Телефон клиента"),
DataType(DataType.Text),
StringLength(50, ErrorMessage = "Максимум 50 символов")]
public string ClientPhone { get; set; }
///<summary>
/// Стоимость ремонта
///</summary>
[DisplayName("Стоимость ремонта"),
Required(ErrorMessage = "Поле 'Стоимость ремонта' не может быть пустым"),
Range(0, 10000, ErrorMessage = "Введите значение от 0 до 10000")]
public int Cost { get; set; }
///<summary>
/// Статус заявки
///</summary>
[DisplayName("Статус заявки")]
public int StatusId { get; set; }
///<summary>
/// Статус заявки
///</summary>
[DisplayName("Статус заявки"), Contrib.Computed]
public Status Status { get; set; }
///<summary>
/// Комметарий исполнителя
///</summary>
[DisplayName("Комметарий исполнителя"),
DataType(DataType.MultilineText),
StringLength(250, ErrorMessage = "Максимум 250 символов")]
public string Comment { get; set; }
}
Что тут примечательного: в отличии от BLToolkit в Dapper нету стандартного атрибута сопоставления имени поля в БД к имени свойства класса, так что пришлось привести имена ключей классов в соответствие с именами свойств в БД: DeviceTypeId, ManufacturerId, EmployeeId и т.д. Ключ класса помечается атрибутом Dapper.Contrib.Extensions.Key, а поля, которые не следует сопоставлять с полями в БД - атрибутом Dapper.Contrib.Extensions.Computed.
Перейдём к работе с БД. Для примера поработаем с сотрудниками.
Команда для получения всей таблицы без связей
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
List<Employee> result = db.GetAll<Employee>().ToList();
}
Получение всей таблицы с заполненным свойством должности
string sql = @"SELECT dbo.Employee.*, dbo.Position.* FROM dbo.Employee INNER JOIN dbo.Position ON dbo.Employee.PositionId = dbo.Position.PositionId;";
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
List<Employee> result = db.Query<Employee, Position>(sql, splitOn: "EmployeeId, PositionId").ToList();
}
Получение отдельной записи с заполненными свойствами должности, коллекцией принятых заявок
string sqlEmployee = @"SELECT dbo.Employee.*, dbo.Position.* FROM dbo.Employee INNER JOIN dbo.Position ON dbo.Employee.PositionId = dbo.Position.PositionId WHERE (EmployeeId = @id);";
string sqlRequests = @"SELECT dbo.Request.*, dbo.DeviceType.*, dbo.Manufacturer.*, dbo.Status.*
FROM dbo.Request INNER JOIN
dbo.DeviceType ON dbo.Request.DeviceTypeId = dbo.DeviceType.DeviceTypeId INNER JOIN
dbo.Manufacturer ON dbo.Request.ManufacturerId = dbo.Manufacturer.ManufacturerId INNER JOIN
dbo.Status ON dbo.Request.StatusId = dbo.Status.StatusId
WHERE (EmployeeId = @id);";
Employee result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.Query<Employee, Position>(sqlEmployee, new { id = id }, splitOn: "EmployeeId, PositionId").Single();
result.Requests = db.Query<Request, DeviceType, Manufacturer, Status>(sqlRequests, new { id = id }, splitOn: "RequestId, DeviceTypeId, ManufacturerId, StatusId").ToList();
}
Сохранение записи
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
if (employee.EmployeeId == 0)
db.Insert<Employee>(employee);
else
db.Update<Employee>(employee);
}
Удаление записи
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
db.Delete<Employee>(employee);
}
Код всего сервиса для работы с БД
#region Using
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using Dapper;
using Dapper.Contrib.Extensions;
using Dapper.Mapper;
#endregion
public class DataService
{
#region Свойства
private static string connectionString;
#endregion
#region Конструктор
static DataService()
{
DataService.connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ServiceCenter"].ConnectionString;
}
public DataService()
{
}
#endregion
#region Тип устройства
///<summary>
/// Возвращает список всех типов устройств
///</summary>
public List<DeviceType> GetDeviceTypes()
{
List<DeviceType> result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.GetAll<DeviceType>().ToList();
}
return result;
}
///<summary>
/// Возвращает тип устройства
///</summary>
public DeviceType GetDeviceType(int id)
{
string sql = @"SELECT dbo.DeviceType.* FROM dbo.DeviceType WHERE (DeviceTypeId = @id)
SELECT dbo.Request.* FROM dbo.Request WHERE (DeviceTypeId = @id);";
DeviceType result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
using (var multi = db.QueryMultiple(sql, new { id = id }))
{
result = multi.Read<DeviceType>().Single();
result.Requests = multi.Read<Request>().ToList();
}
}
return result;
}
///<summary>
/// Сохранить тип устройства
///</summary>
public void SaveDeviceType(DeviceType deviceType)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
if (deviceType.DeviceTypeId == 0)
db.Insert<DeviceType>(deviceType);
else
db.Update<DeviceType>(deviceType);
}
}
///<summary>
/// Удалить тип устройства
///</summary>
public void DeleteDeviceType(DeviceType deviceType)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
db.Delete<DeviceType>(deviceType);
}
}
#endregion
#region Производитель
///<summary>
/// Возвращает список всех производителей
///</summary>
public List<Manufacturer> GetManufacturers()
{
List<Manufacturer> result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.GetAll<Manufacturer>().ToList();
}
return result;
}
///<summary>
/// Возвращает производителя
///</summary>
public Manufacturer GetManufacturer(int id)
{
string sqlManufacturer = @"SELECT dbo.Manufacturer.* FROM dbo.Manufacturer WHERE (ManufacturerId = @id);";
string sqlRequests = @"SELECT dbo.Request.*, dbo.Employee.*, dbo.DeviceType.*, dbo.Status.*
FROM dbo.Request INNER JOIN
dbo.Employee ON dbo.Request.EmployeeId = dbo.Employee.EmployeeId INNER JOIN
dbo.DeviceType ON dbo.Request.DeviceTypeId = dbo.DeviceType.DeviceTypeId INNER JOIN
dbo.Status ON dbo.Request.StatusId = dbo.Status.StatusId
WHERE (ManufacturerId = @id);";
Manufacturer result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.Query<Manufacturer>(sqlManufacturer, new { id = id }).Single();
result.Requests = db.Query<Request, Employee, DeviceType, Status>(sqlRequests, new { id = id }, splitOn: "RequestId, EmployeeId, DeviceTypeId, StatusId").ToList();
}
return result;
}
///<summary>
/// Сохранить производителя
///</summary>
public void SaveManufacturer(Manufacturer manufacturer)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
if (manufacturer.ManufacturerId == 0)
db.Insert<Manufacturer>(manufacturer);
else
db.Update<Manufacturer>(manufacturer);
}
}
///<summary>
/// Удалить производителя
///</summary>
public void DeleteManufacturer(Manufacturer manufacturer)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
db.Delete<Manufacturer>(manufacturer);
}
}
#endregion
#region Должность
///<summary>
/// Возвращает список всех должностей
///</summary>
public List<Position> GetPositions()
{
List<Position> result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.GetAll<Position>().ToList();
}
return result;
}
///<summary>
/// Возвращает должность
///</summary>
public Position GetPosition(int id)
{
string sql = @"SELECT dbo.Position.* FROM dbo.Position WHERE (PositionId = @id)
SELECT dbo.Employee.* FROM dbo.Employee WHERE (PositionId = @id);";
Position result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
using (var multi = db.QueryMultiple(sql, new { id = id }))
{
result = multi.Read<Position>().Single();
result.Employees = multi.Read<Employee>().ToList();
}
}
return result;
}
///<summary>
/// Сохранить должность
///</summary>
public void SavePosition(Position position)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
if (position.PositionId == 0)
db.Insert<Position>(position);
else
db.Update<Position>(position);
}
}
///<summary>
/// Удалить должность
///</summary>
public void DeletePosition(Position position)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
db.Delete<Position>(position);
}
}
#endregion
#region Сотрудник
///<summary>
/// Возвращает список всех сотрудников
///</summary>
public List<Employee> GetEmployees()
{
string sql = @"SELECT dbo.Employee.*, dbo.Position.* FROM dbo.Employee INNER JOIN dbo.Position ON dbo.Employee.PositionId = dbo.Position.PositionId;";
List<Employee> result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.Query<Employee, Position>(sql, splitOn: "EmployeeId, PositionId").ToList();
}
return result;
}
///<summary>
/// Возвращает сотрудника
///</summary>
public Employee GetEmployee(int id)
{
string sqlEmployee = @"SELECT dbo.Employee.*, dbo.Position.* FROM dbo.Employee INNER JOIN dbo.Position ON dbo.Employee.PositionId = dbo.Position.PositionId WHERE (EmployeeId = @id);";
string sqlRequests = @"SELECT dbo.Request.*, dbo.DeviceType.*, dbo.Manufacturer.*, dbo.Status.*
FROM dbo.Request INNER JOIN
dbo.DeviceType ON dbo.Request.DeviceTypeId = dbo.DeviceType.DeviceTypeId INNER JOIN
dbo.Manufacturer ON dbo.Request.ManufacturerId = dbo.Manufacturer.ManufacturerId INNER JOIN
dbo.Status ON dbo.Request.StatusId = dbo.Status.StatusId
WHERE (EmployeeId = @id);";
Employee result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.Query<Employee, Position>(sqlEmployee, new { id = id }, splitOn: "EmployeeId, PositionId").Single();
result.Requests = db.Query<Request, DeviceType, Manufacturer, Status>(sqlRequests, new { id = id }, splitOn: "RequestId, DeviceTypeId, ManufacturerId, StatusId").ToList();
}
return result;
}
///<summary>
/// Сохранить сотрудника
///</summary>
public void SaveEmployee(Employee employee)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
if (employee.EmployeeId == 0)
db.Insert<Employee>(employee);
else
db.Update<Employee>(employee);
}
}
///<summary>
/// Удалить сотрудника
///</summary>
public void DeleteEmployee(Employee employee)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
db.Delete<Employee>(employee);
}
}
#endregion
#region Состояние заявки
///<summary>
/// Возвращает список всех состояний заявки
///</summary>
public List<Status> GetStatuses()
{
List<Status> result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.GetAll<Status>().ToList();
}
return result;
}
///<summary>
/// Возвращает состояние заявки
///</summary>
public Status GetStatus(int id)
{
string sqlStatus = @"SELECT dbo.Status.* FROM dbo.Status WHERE (StatusId = @id);";
string sqlRequests = @"SELECT dbo.Request.*, dbo.Employee.*, dbo.DeviceType.*, dbo.Manufacturer.*
FROM dbo.Request INNER JOIN
dbo.Employee ON dbo.Request.EmployeeId = dbo.Employee.EmployeeId INNER JOIN
dbo.DeviceType ON dbo.Request.DeviceTypeId = dbo.DeviceType.DeviceTypeId INNER JOIN
dbo.Manufacturer ON dbo.Request.ManufacturerId = dbo.Manufacturer.ManufacturerId
WHERE (StatusId = @id);";
Status result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.Query<Status>(sqlStatus, new { id = id }).Single();
result.Requests = db.Query<Request, Employee, DeviceType, Manufacturer>(sqlRequests, new { id = id }, splitOn: "RequestId, EmployeeId, DeviceTypeId, ManufacturerId").ToList();
}
return result;
}
///<summary>
/// Сохранить состояние заявки
///</summary>
public void SaveStatus(Status status)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
if (status.StatusId == 0)
db.Insert<Status>(status);
else
db.Update<Status>(status);
}
}
///<summary>
/// Удалить состояние заявки
///</summary>
public void DeleteStatus(Status status)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
db.Delete<Status>(status);
}
}
#endregion
#region Заявка
///<summary>
/// Возвращает список всех заявок
///</summary>
public List<Request> GetRequests()
{
string sql = @"SELECT dbo.Request.*, dbo.Employee.*, dbo.DeviceType.*, dbo.Manufacturer.*, dbo.Status.*
FROM dbo.Request INNER JOIN
dbo.Employee ON dbo.Request.EmployeeId = dbo.Employee.EmployeeId INNER JOIN
dbo.DeviceType ON dbo.Request.DeviceTypeId = dbo.DeviceType.DeviceTypeId INNER JOIN
dbo.Manufacturer ON dbo.Request.ManufacturerId = dbo.Manufacturer.ManufacturerId INNER JOIN
dbo.Status ON dbo.Request.StatusId = dbo.Status.StatusId;";
List<Request> result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.Query<Request, Employee, DeviceType, Manufacturer, Status>(sql, splitOn: "RequestId, EmployeeId, DeviceTypeId, ManufacturerId, StatusId").ToList();
}
return result;
}
///<summary>
/// Возвращает заявку
///</summary>
public Request GetRequest(int id)
{
string sql = @"SELECT dbo.Request.*, dbo.Employee.*, dbo.DeviceType.*, dbo.Manufacturer.*, dbo.Status.*
FROM dbo.Request INNER JOIN
dbo.Employee ON dbo.Request.EmployeeId = dbo.Employee.EmployeeId INNER JOIN
dbo.DeviceType ON dbo.Request.DeviceTypeId = dbo.DeviceType.DeviceTypeId INNER JOIN
dbo.Manufacturer ON dbo.Request.ManufacturerId = dbo.Manufacturer.ManufacturerId INNER JOIN
dbo.Status ON dbo.Request.StatusId = dbo.Status.StatusId
WHERE (dbo.Request.RequestId = @id);";
Request result = null;
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
result = db.Query<Request, Employee, DeviceType, Manufacturer, Status>(sql, new { id = id }, splitOn: "RequestId, EmployeeId, DeviceTypeId, ManufacturerId, StatusId").Single();
}
return result;
}
///<summary>
/// Сохранить заявку
///</summary>
public void SaveRequest(Request request)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
if (request.RequestId == 0)
db.Insert<Request>(request);
else
db.Update<Request>(request);
}
}
///<summary>
/// Удалить заявку
///</summary>
public void DeleteRequest(Request request)
{
using (IDbConnection db = new SqlConnection(DataService.connectionString))
{
db.Delete<Request>(request);
}
}
#endregion
}
Какие встретили особенности: нет Linq, код запроса надо писать вручную, что в зависимости от ситуации может быть как плюсом так и минусом, как и BLToolkit не умеет заполнять ассоциации, чего в общем-то от микро-ORM и не ожидается.
Код контроллеров практически не изменился, для примера посмотрим контроллер для работы с сотрудниками
#region Using
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Data = ServiceCenter.Data.DapperNet;
#endregion
public class EmployeeController : Controller
{
#region Список
public ActionResult Index()
{
ViewBag.Title = "Сотрудники";
Data.DataService ds = new Data.DataService();
List<Data.Employee> employees = ds.GetEmployees().OrderBy(x => x.SurName).ThenBy(x => x.Name).ToList();
return View(employees);
}
#endregion
#region Создание
public ActionResult Create()
{
ViewBag.Title = "Сотрудники - добавление записи";
return View();
}
[HttpPost]
public ActionResult Create(Data.Employee employee, FormCollection collection)
{
ViewBag.Title = "Сотрудники - добавление записи";
int positionId = 0;
if (!Int32.TryParse(collection["PositionId"], out positionId))
ModelState.AddModelError("Position", "Выберите должность!");
if (!ModelState.IsValid)
return View(employee);
employee.PositionId = positionId;
Data.DataService ds = new Data.DataService();
try
{
ds.SaveEmployee(employee);
return RedirectToAction("Index");
}
catch (Exception ex)
{
ModelState.AddModelError("", string.Format("При создании записи возникла ошибка:{0}{1}", Environment.NewLine, ex.Message));
return View(employee);
}
}
#endregion
#region Редактирование
public ActionResult Edit(int id)
{
ViewBag.Title = "Сотрудники - редактирование записи";
Data.DataService ds = new Data.DataService();
Data.Employee employee = ds.GetEmployee(id);
ViewBag.Message = employee.FullName;
return View(employee);
}
[HttpPost]
public ActionResult Edit(Data.Employee employee, FormCollection collection)
{
ViewBag.Title = "Сотрудники - редактирование записи";
Data.DataService ds = new Data.DataService();
ViewBag.Message = ds.GetEmployee(employee.EmployeeId).FullName;
int positionId = 0;
if (!Int32.TryParse(collection["PositionId"], out positionId))
ModelState.AddModelError("Position", "Выберите должность!");
if (!ModelState.IsValid)
return View(employee);
employee.PositionId = positionId;
try
{
ds.SaveEmployee(employee);
return RedirectToAction("Index");
}
catch (Exception ex)
{
ModelState.AddModelError("", string.Format("При редактировании записи возникла ошибка:{0}{1}", Environment.NewLine, ex.Message));
return View(employee);
}
}
#endregion
#region Удаление
public ActionResult Delete(int id)
{
Data.DataService ds = new Data.DataService();
Data.Employee employee = ds.GetEmployee(id);
ds.DeleteEmployee(employee);
return RedirectToAction("Index");
}
#endregion
#region DropDown
public ActionResult GetEmployeeDropDown(int selectedId)
{
Data.DataService ds = new Data.DataService();
ViewData.Model = ds.GetEmployees().OrderBy(x => x.SurName).ThenBy(x => x.Name).Select(x => new SelectListItem()
{
Text = x.FullName,
Value = x.EmployeeId.ToString(),
Selected = x.EmployeeId == selectedId
});
ViewData.ModelMetadata = new ModelMetadata(ModelMetadataProviders.Current, null, null, typeof(int), "EmployeeId")
{
NullDisplayText = "выберите сотрудника"
};
return View("DropDown");
}
#endregion
}
Во вложении находятся проект и дамп базы данных.