Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Dapper представляет собой технологию сопоставления (маппинга) результатов sql-запросов с классами c#. В этом плане Dapper немного похож на Entity Framework. В то же время за счет своей легковесности Dapper обеспечивает большую производительность и быстрее позволяет выполнять запросы, нежели Entity Framework.
Рассмотрим, как мы можем использовать Dapper. Вначале добавим Dapper в наш проект:
Затем определим модель User, с которой мы будем работать:
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
И добавим в проект в папку App_Data новую базу данных, которую назовем userstore. Далее в этой базе данных определим одну таблицу, которая соответствует описанию модели User:
Затем также добавим в папку Models класс репозитория UserRepository:
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 метод расширения Query<T>
,
который в качестве параметра принимает sql-выражение и может возвращать объект типа T, с которым сопоставляются результаты запроса.
Затем в файле 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"); } } }