Dapper в ASP.NET MVC
Dapper — технология маппинга (сопоставления) результатов SQL-запросов с классами в C#. Благодаря своей легковесности, Dapper характеризуется большей производительностью и позволяет быстрее выполнять запросы, чем тот же Entity Framework.
Посмотрим, каким образом можно использовать Dapper. В первую очередь добавим его в наш проект:
Потом определим User-модель, с которой далее будем работать:
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
Следующий этап — добавление в проект в папку App_Data новой БД, которую можно назвать, к примеру, userstore. Потом в этой БД нам следует определить одну таблицу, соответствующую описанию модели User:
Теперь давайте добавим класс репозитория UserRepository в папку Models:
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using Dapper; namespace DapperApplication.Models { public class UserRepository { string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; public List<User> GetUsers() { List<User> users = new List<User>(); using(IDbConnection db = new SqlConnection(connectionString)) { users = db.Query<User>("SELECT * FROM Users").ToList(); } return users; } public User Get(int id) { User user = null; using (IDbConnection db = new SqlConnection(connectionString)) { user = db.Query<User>("SELECT * FROM Users WHERE Id = @id", new { id }).FirstOrDefault(); } return user; } public User Create(User user) { using (IDbConnection db = new SqlConnection(connectionString)) { var sqlQuery = "INSERT INTO Users (Name, Age) VALUES(@Name, @Age); SELECT CAST(SCOPE_IDENTITY() as int)"; int? userId = db.Query<int>(sqlQuery, user).FirstOrDefault(); user.Id = userId; } return user; } public void Update(User user) { using (IDbConnection db = new SqlConnection(connectionString)) { var sqlQuery = "UPDATE Users SET Name = @Name, Age = @Age WHERE Id = @Id"; db.Execute(sqlQuery, user); } } public void Delete(int id) { using (IDbConnection db = new SqlConnection(connectionString)) { var sqlQuery = "DELETE FROM Users WHERE Id = @id"; db.Execute(sqlQuery, new { id }); } } } }
Чтобы выполнять запросы, Dapper предоставляет для объектов IDbConnection метод расширения
Теперь определим в файле web.config подключение, которое будет применяться:
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename='|DataDirectory|\userstore.mdf';Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings>
Ну и, наконец, давайте определим контроллер, который станет использовать для работы с пользователями репозиторий:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using DapperApplication.Models; namespace DapperApplication.Controllers { public class UsersController : Controller { UserRepository repo = new UserRepository(); public ActionResult Index() { return View(repo.GetUsers()); } public ActionResult Details(int id) { User user = repo.Get(id); if(user!=null) return View(user); return HttpNotFound(); } public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(User user) { repo.Create(user); return RedirectToAction("Index"); } public ActionResult Edit(int id) { User user = repo.Get(id); if (user != null) return View(user); return HttpNotFound(); } [HttpPost] public ActionResult Edit(User user) { repo.Update(user); return RedirectToAction("Index"); } [HttpGet] [ActionName("Delete")] public ActionResult ConfirmDelete(int id) { User user = repo.Get(id); if (user != null) return View(user); return HttpNotFound(); } [HttpPost] public ActionResult Delete(int id) { repo.Delete(id); return RedirectToAction("Index"); } } }