Dapper в ASP.NET MVC | OTUS

Dapper в ASP.NET MVC

C__HeadlineSEO_970x70-1801-f7b24e.png

Dapper — технология маппинга (сопоставления) результатов SQL-запросов с классами в C#. Благодаря своей легковесности, Dapper характеризуется большей производительностью и позволяет быстрее выполнять запросы, чем тот же Entity Framework.

Посмотрим, каким образом можно использовать Dapper. В первую очередь добавим его в наш проект:

dapper1-20219-1baa24.png

Потом определим User-модель, с которой далее будем работать:

    public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

Следующий этап — добавление в проект в папку App_Data новой БД, которую можно назвать, к примеру, userstore. Потом в этой БД нам следует определить одну таблицу, соответствующую описанию модели User:

dapper2-20219-acc8b6.png

Теперь давайте добавим класс репозитория 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 метод расширения 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");
        }
    }
}

Источник

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто