استفاده از Dapper.NET ORM در MVC

در این مقاله ما با Dapper آشنا شده و نحوه استفاده از Dapper.NET ORM را در برنامه های ASP.NET MVC با استفاده از Repository را آموزش خواهیم داد.

استفاده از Dapper.NET ORM در MVC

Dapper چیست؟

Dapper یک Mapper ساده برای NET. است. Dapper یک فایل است که میتوانید آن را به پروژه خود اضافه کرده تا رابط  IDbConnection برای گسترش برنامه باشد. 

در صورت تمایل میتوانید از آموزش تصویری استفاده از در Dapper در سی شارپ نیز استفاده کنید .

که 3 کمک کننده را فراهم میکند:
1- یک query اجرا کرده و نتایج آن را به strongly typed List ارسال نمایید.
2- یک query اجرا کنید و نتایج را به یک لیست پویا ارسال نمایید.
3- یک Command اجرا کنید بدون بازگرداندن نتیجه ایجاد کنید.
4- یک Command را چندین بار اجرا کنید.

یکی از ویژگی های کلیدی Dapper عملکرد آن است. معیار های زیر نشان میدهد که چه مدت طول میکشد تا 500 SELECT از داده های DB را map و به objects مورد نظر ما برگشت داده شوند.


اکنون که با مزایای استفاده از Dapper آشنا شده اید به پیاده سازی یک برنامه با استفاده از Dapper خواهیم پرداخت.

یک پروژه ASP.NET MVC ایجاد کنید.

در DB خود جداول زیر را بسازید و connectionStrings خود را به web.config اضافه کنید.

Dapper را از Nuget Package Manager نصب کنید.

PM> Install-Package Dapper

یک پوشه جدید به نام Dapper به آن اضافه نمایید.

در پوشه مورد نظر کلاسی با نام User  اضافه کرده و کد زیر را به آن اضافه نمایید.

public class User
    {
        public User()
        {
            this.Address = new List<Address>();
        }

        public int UserID { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string Email { get; set; }

        public List<Address> Address { get; set; }
    }

کلاسی با نام  Address اضافه کرده و کد زیر را به آن اضافه نمایید.

public class Address
    {
        public int AddressID { get; set; }
        public int UserID { get; set; }
        public string AddressType { get; set; }
        public string StreetAddress { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ZipCode { get; set; }
    }

یک interface با نام IUserRepository ایجاد کرده و کد زیر را به آن اضافه نمایید.

public interface IUserRepository
    {
        List<User> GetAll();
        User Find(int id);
        User Add(User user);
        User Update(User user);
        void Remove(int id);
        User GetUserInformatiom(int id);
    }

اکنون کلاسی با نام UserRepository ایجاد کرده و کد زیر را به آن اضافه نمایید. به خاطر داشته باشید که UserRepository از IUserRepository ارث بری کرده است.

    public class UserRepository : IUserRepository
    {
        private IDbConnection _db = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
        public List<User> GetAll()
        {
            return this._db.Query<User>("SELECT * FROM Users").ToList();
        }

        public User Find(int id)
        {
            return this._db.Query<User>("SELECT * FROM Users WHERE UserID = @UserID", new { id }).SingleOrDefault();
        }

        public User Add(User user)
        {
            var sqlQuery = "INSERT INTO Users (FirstName, LastName, Email) VALUES(@FirstName, @LastName, @Email); " + "SELECT CAST(SCOPE_IDENTITY() as int)";
            var userId = this._db.Query<int>(sqlQuery, user).Single();
            user.UserID = userId;
            return user;
        }

        public User Update(User user)
        {
            var sqlQuery =
                "UPDATE Users " +
                "SET FirstName = @FirstName, " +
                "    LastName  = @LastName, " +
                "    Email     = @Email " +
                "WHERE UserID = @UserID";
            this._db.Execute(sqlQuery, user);
            return user;
        }

        public void Remove(int id)
        {
            throw new NotImplementedException();
        }

        public User GetUserInformatiom(int id)
        {
            using (var multipleResults = this._db.QueryMultiple("GetUserByID", new { Id = id }, commandType: CommandType.StoredProcedure))
            {
                var user = multipleResults.Read<User>().SingleOrDefault();

                var addresses = multipleResults.Read<Address>().ToList();
                if (user != null && addresses != null)
                {
                    user.Address.AddRange(addresses);
                }

                return user;
            }
        }
    }

اکنون از repository  بالا در HomeController.cs استفاده خواهیم کرد.
یک instance  از کلاس UserRepository بسازید.

private IUserRepository _repository = new UserRepository();

در اکشن index  کد زیر را اضافه نمایید.

public ActionResult Index()
        {
            return View(_repository.GetAll());
        }

یک view  جدید ایجاد کرده و کد زیر را به آن اضافه کنید.

@model IEnumerable<DapperORM.Dapper.User>
@{
    ViewBag.Title = "برنامه نویسان";
}
<h2>کاربران</h2>
<table dir="rtl" class="table table-bordered">
    <tr>
        <th>
            نام
        </th>
        <th>
            نام خانوادگی
        </th>
        <th>
            ایمیل
        </th>
        <th></th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.FirstName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Email)
            </td>
            <td>
                @Html.ActionLink("ویرایش", "Edit", new { id = item.UserID }) |
                @Html.ActionLink("مشاهدی", "Details", new { id = item.UserID }) |
                @Html.ActionLink("حذف", "Delete", new { id = item.UserID })
            </td>
        </tr>
    }
</table>

نتیجه کار شما شبیه به شکل زیر خواهد بود.

آموزش asp.net mvc

فایل های ضمیمه
دانلود نسخه ی PDF این مطلب