آموزش Dapper رایگان | چگونه از Dapper استفاده کنیم؟ – به زبان ساده
Dapper یک نگاشتگر شی ساده برای فریمورک توسعه داتنت به حساب میآید. در طول سالهای اخیر، Dapper تبدیل به محبوبترین فریموک Micro-ORM در جامعه داتنت شده است. میکرو ORMهای بسیاری در جامعه .NET به رقابت با یکدیگر پرداختهاند، اما Dapper به عنوان پیشتاز در میان تمام آنها ظاهر شده است. تمرکز اصلی در این نوشتار بر آموزش Dapper و نحوه استفاده از آن خواهد بود. در این نوشتار، ابتدا به سوال Dapper چیست پاسخ داده شده است. سپس برخی مفاهیم و موضوعات مرتبط با Dapper به طور خلاصه شرح داده میشود. پس از آن به برخی سوالات مهم پیرامون Dapper پاسخ داده میشود. در ادامه مطلب به مبحث اصلی یعنی آموزش Dapper پرداخته شده است. همچنین، منابع و دورههای مرتبط با آموزش Dapper در خلال سرفصلهای این نوشته معرفی شدهاند.
آموزش Dapper در این مقاله با رویکرد پروژه محور ارائه میشود؛ به گونهای که کلیه مراحل پیادهسازی یک پروژه ساده با ASP.NET در Visual Studio آموزش داده خواهد شد. در این پروژه، یک وباپلیکیشن ساده توسعه داده میشود. کارکرد این وباپلیکیشن به این صورت است که میتوان مشخصات شرکتهای تجاری مختلف را در آن ذخیره کرد. برای آموزش بهتر، ابتدا این پروژه با استفاده از Entity Framework پیادهسازی خواهد شد و سپس تغییرات لازم برای به کارگیری Dapper در پروژه اعمال میشود. Entity Framework برخلاف Dapper یک ORM کامل است. Dapper یک ریز ORM یا میکرو ORM به حساب میآید. جهت یادگیری Dapper به طور کامل، تمام مفاهیم لازم با جزئیات بیشتری در طول مطلب آموزش Dapper شرح داده خواهد شد. در ابتدا بهتر است به این سوال مهم پاسخ داده شود که Dapper چیست؟
Dapper چیست ؟
Dapper یک ابزار ساده نگاشت شی (Object Relational Mapping | ORM) برای داتنت به حساب میآید. Dapper به لحاظ سرعت عنوان پادشاه Micro ORM را از آن خود کرده و تقریباً سرعت آن در حد استفاده از یک خوانشگر داده خام ADO.NET است. Dapper رابط IDbConnection را با فراهم کردن متدهای افزونه (Extension Method) مفید برای جستجو (Query) پایگاه داده تعمیم میدهد. IDbConnection امکان پیادهسازی یک کلاس اتصال (Connection Class) را به وجود میآورد. Dapper در اصل برای استفاده در موقعیتهایی طراحی شده است که قصد کار با نوع دادههای نیرومند (Strongly Typed) به عنوان اشیا کسبوکار در یک اپلیکیشن داتنت وجود داشته باشد.
اتلاف وقت در کدنویسی برای نگاشت نتایج کوئری از خوانشگرهای داده ADO.NET به نمونههای (Instance) آن اشیا، با استفاده از Dapper از بین خواهد رفت. Dapper یک پروژه متنباز تحت مجوز آپاچی به حساب میآید. Dapper توسط Stackoverflow ساخته شده است. Stackoverflow بستری برای همکاری و اشتراک اطلاعات محسوب میشود. Dapper به صورت یک بسته نوگت (Nuget) در دسترس است و توسعهدهندگان بیش از ۱۶ میلیون بار آن را دانلود کردهاند. Nuget مدیر بسته رسمی داتنت به شمار میرود. برای درک بهتر اینکه Dapper چیست و مفاهیمی که در تعریف آن به کار گرفته شد، ابتدا بهتر است تعریفی از ORM ارائه شود. بنابراین، در ادامه به این سوال پاسخ داده شده است که ORM چیست؟ پیش از آن، دوره آموزش کاربرد Dapper ORM در #C (سی شارپ) معرفی شده است.
ORM چیست ؟
ORM سرنامی برای عبارت «Object Relational Mapping» و به معنی «نگاشت شی رابطهای» است که مسئولیت نگاشت بین پایگاه داده و زبان برنامهنویسی را برعهده دارد. ORM یک فن برنامهنویسی برای تبدیل دادهها میان پایگاه دادههای رابطهای و زبانهای برنامهنویسی شیگرا مثل جاوا، سیشارپ و سایر موارد است.
ORMهای سنتی مثل Entity Framework، یک بسته کامل ORM به حساب میآیند. به این ترتیب، تعریف کوتاهی از ORM ارائه شد؛ اما آیا Dapper آنطور که «Dapper ORM» خوانده میشود، واقعاً ORM است و تمام امکانات یک ORM را ارائه میدهد؟ در ادامه به این سوال پاسخ داده شده است.
آیا Dapper یک ORM است؟ | میکرو ORM چیست؟
Dapper جز آن دسته از ابزارهایی است که به آنها micro-ORM یا ریز ORM گفته میشود. این ابزارها تنها بخشی از قابلیتهای یک نگاشتگر شی رابطهای کامل را اجرا میکنند. این ویژگیها بسته به محصول متفاوت هستند.
در جدول زیر، ایده کلی از قابلیتهایی ارائه شده است که میتوان در یک میکرو ORM یافت و در واقع مقایسهای میان ORM و میکرو ORM صورت گرفته است:
میکرو ORM | ORM | |
نگاشت کوئریها به اشیا | بلی | بلی |
ذخیرهسازی نتایج | خیر | بلی |
ردیابی تغییرات | خیر | بلی |
تولید SQL | خیر | بلی |
مدیریت هویت | خیر | بلی |
مدیریت هبستگی | خیر | بلی |
بارگذاری ناهمگون | خیر | بلی |
پشتیبانی از واحد کاری | خیر | بلی |
انتقال پایگاه داده | خیر | بلی |
میتوان از جدل فوق نتیجه گرفت که کارکرد Dapper روی حروف O و M در سرنام ORM یعنی عملیات «نگاشت شی» (Object Mapping) متمرکز شده است. در خصوص جدول بالا باید دو نکته را متذکر شد:
- افزونههایی به Dapper اضافه شده است که قابلیت کمینهای از ردیابی تغییرات (Change Tracking) را ارائه میدهند.
- Dapper در عمل کد SQL تولید میکند، اما این کار به صورت محدود انجام میشود.
بنابراین، مشخص شد که Dapper یک ORM کامل نیست و در دسته ریز ORMها قرار میگیرد. به زبان ساده، یک Micro-ORM، نگاشت پایگاه داده و اشیا داتنت را انجام میدهد. در ادامه برخی از مزیتهای یک میکرو ORM شرح داده شده است.
مزیتهای میکرو ORM چه هستند؟
در این بخش از مطلب آموزش Dapper برخی از مزیتهای میکرو ORMها فهرست شدهاند:
- میکرو ORMها معمولاً عملکرد بهتری در مقایسه با ORMهای سنتی دارند. تمرکز بر نگاشت دادههای پایگاه داده به نمایش کد (Code Representation) آنها به این معنا است که زمان کمتری برای انجام کارهای دیگر در حال صرف شدن است. به همین دلیل، میزان عملکرد برای ریز ORMها در سطح بهتری قرار دارد.
- در صورتی که پروژه مربوطه تنها دارای چند جدول پایگاه داده باشد، راهاندازی یکفریمورک ORM تمام عیار اضافهکاری محسوب میشود. برای پروژههای کوچک، نوشتن کوئریهای ساده SQL در داخل کدها احتمالاً نسبت به یک ORM سریعتر خواهد بود. با این وجود، در مورد فریمورک Entity، شروع و اجرای کار بسیار سادهسازی شده است. اما در صورتی که قرار است از ORM دیگری استفاده شود، یک میکرو ORM میتواند رویکرد سریعتری محسوب شود.
- در مواردی که اپلیکیشن به میزان زیادی از عملیات ذخیرهسازی در لایه نما (View) استفاده کند، میتوان دریافت که میکرو ORMها کد را سادهتر میسازند و نگهداری کدها با استفاده از یک میکرو ORM آسانتر است. دلیل این مسئله میتواند این باشد که لایه منطق در پایگاه داده واقع شده است. بنابراین، نیازی به همه قابلیتهای یک فریمورک ORM تمام عیار وجود نخواهد داشت.
- همانطور که پیشتر بیان شد، یک Micro-ORM با هر پایگاه دادهای کار میکند. توسعهدهنده میتواند کوئریهای SQL را خودش بنویسد، بنابراین تا زمانی که مهارت نوشتن کوئریهای بهینه SQL وجود داشته باشد، استفاده از یک میکرو ORM نسبت به ORMهای کاملی مثل فریمورک Entity انتخاب بهتری خواهد بود.
با وجود داشتن مزایای بسیار، فریمورکهای میکرو ORM دارای برخی کاستیها و معایب نیز هستند که در ادامه مطلب آموزش Dapper به شرح آنها پرداخته شده است.
معایب میکرو ORM
دانستن معایب میکرو ORMها میتواند در آموزش Dapper مفید واقع شود.
در این بخش، برخی از معایب و نقاط ضعف یک Micro-ORM فهرست شدهاند:
- نوشتن کوئریهای SQL توسط خود فرد میتواند هم به عنوان یک مزیت و هم به عنوان یکی از معایب میکرو ORMها شمرده شود. این مسئله بستگی به میزان مهارت و بهینگی کدنویسی کوئریهای SQL دارد. به دلیل اینکه Entity Framework یا هر ORM دیگری کوئریها را بر اساس قوانین تعیین شده مینویسند، این امکان وجود دارد که در صورت کمدقتی و کمتوجهی کاربر، فریمورک Entity یا یک ORM دیگر کدهای کوئری SQL بهتری تولید کنند.
- یکی دیگر از معایب میکرو ORM این است که کار کردن با رابطهها و نگاشتها در میکرو ORM میتواند دشوار باشد. Micro-ORMها با اشیا واحد به خوبی کار میکنند، اما برای بارگذاری روابط در شی باید ساختار کوئریها را به شکل خاصی شکل داد. با این وجود، عملیات نگاشت در Dapper به میزان قابل توجهی بهبود داده شده است و در حال حاضر میتوان به راحتی نگاشت رابطهها را انجام داد. اما در هر صورت این عملیات به سادگی عملیات انجام شده در ORM نخواهد بود.
- در صورتی که نیاز به اعتبارسنجی گسترده وجود داشته باشد، بهتر است از ORMهای معمول استفاده شود. زیرا تمرکز اصلی میکرو ORMها بر عملیات نگاشت با سرعت بالاتر است که هزینه از دست دادن ویژگیهایی نظیر اعتبارسنجی را به دنبال خواهد داشت.
با شرح مزیتها و معایب Micor-ORM، این سوال به وجود میآید که کدام یک بهتر است؟ ORM یا Micro-ORM ؟ بنابراین، در ادامه آموزش Dapper به این سوال مهم پاسخ داده شده است.
ORM بهتر است یا میکرو ORM؟
این سوال دارای پاسخ ثابتی نیست. در واقع، پاسخ این سوال بسته به شرایط متفاوت است. در بسیاری از پروژهها، دستورالعملهایی ذخیره میشوند که برای منطق پیچیده مورد نیاز هستند. در چنین مواردی، یک ORM مثل Entity Framework پشتیبانی لازم را ارائه نمیدهد و Dapper راهکار مناسبی خواهد بود. در صورتی که اپلیکیشن مربوطه به یک اپلیکیشن CRUD نزدیک باشد و محاسبات پیچیده اندکی داشته باشد، بهتر است از Entity Framework استفاده شود.
اما در صورتی که منطق پیچیدهای در سمت پایگاه داده وجود داشته باشد، Dapper یا ترکیبی از Dapper و فریمورک Entity انتخاب مناسبی محسوب میشود. در صورتی که دغدغه اصلی بهینگی باشد، بهتر است از میکرو ORM استفاده شود. با پایان تعریف و نگاه کلی به ORMها و میکرو ORMها و بیان مزیتها و معایب آنها، در ادامه به صورت جزئی تر پیرامون Dapper بحث و به این سوال پاسخ داده شده است که چه زمانی باید از Dapper استفاده کرد؟
چه زمانی باید از Dapper استفاده کرد؟
برای تصمیمگیری در مورد اینکه چه زمانی از Dapper استفاده شود، باید دلیل اصلی موجودیت Dapper یعنی کارایی (عملکرد | Performance) را در نظر داشت. توسعهدهندگان اصلی Dapper از نیاکان Entity Framework Core یعنی LINQ to SQL که عمر کوتاهی داشت استفاده میکردند. آنها متوجه شدند که عملکرد کوئریها برای ترافیک در حال افزایش سایت (Stackoverflow) کافی نبود. بنابراین، میکرو ORM جدیدی را توسعه دادند و نام آن را Dapper گذاشتند.
در نتیجه، Dapper انتخاب مناسبی برای موقعیتهایی است که دادههای فقط خواندنی مرتباً تغییر میکنند و درخواست میشوند. Dapper به طور خاص در موقعیتهای بدون حالت (مثلاً وب) مناسب است. در چنین موقعیتهایی نیازی به نگهداری گرافهای شی پیچیده در حافظه برای یک مدت خاص وجود ندارد. Dapper برخلاف یک ORM کامل، کوئریهای نوشته شده با زبانهای داتنت را به SQL ترجمه نمیکند.
بنابراین برای کار با Dapper باید مهارت کافی در نوشتن کوئریها با SQL وجود داشته باشد یا شخص دیگری کدنویسی آن را انجام دهد. Dapper هیچ انتظار خاصی در خصوص طرح و الگوی پایگاه داده ندارد. Dapper برخلاف Entity Framework Core به قراردادها و ضوابط خاصی متکی نیست. بنابراین، در مواردی که ساختار پایگاه داده به طور خاص نرمالسازی نشده باشد، Dapper انتخاب مناسبی خواهد بود. Dapper با یک شی ADO.NET IDbConnection کار میکند.
این مسئله به این معنا است که Dapper با هر سیستم پایگاه دادهای کار خواهد کرد که برای آن یک فراهم کننده ADO.NET وجود داشته باشد. دلیلی وجود ندارد که نتوان به طور همزمان از یک ORM و یک میکرو ORM در پروژه استفاده کرد. به این ترتیب مشخص شد که چه زمانی باید از Dapper استفاده کرد، حال برای درک بهتر چیستی Dapper نیاز است به این سوال پاسخ داده شود که Dapper دقیقاً چه کاری انجام میدهد؟ در ادامه آموزش Dapper به این سوال پاسخ داده شده است.
Dapper چه کاری انجام میدهد؟
در این بخش از آموزش Dapper برای نشان دادن اینکه Dapper چه کاری انجام میدهد، کدهای استاندارد ADO.NET برای بازیابی دادهها از یک پایگاه داده و تحقق بخشیدن به دادهها به عنوان مجموعهای از اشیا نوع Product (محصول) ارائه شده است. اما پیش از آن بهتر است برای درک بهتر، شرح مختصری از مفهوم ADO.NET ارائه شود. بنابراین، در ادامه به این سوال پاسخ داده شده است که ADO.NET چیست؟
ADO.NET چیست ؟
به بیان ساده، ADO.NET مجموعهای از کلاسها (یک فریمورک) است که میتواند برای تعامل با منابع داده مانند پایگاه داده و فایلهای XML مورد استفاده قرار بگیرد. این منابع داده میتوانند در هر اپلیکیشن توسعه داده شده با داتنت استفاده شوند. ADO سرنامی برای «ActiveX Data Objects» است. از ADO.NET برای اتصال به یک پایگاه داده، اجرای دستورات، بازیابی دادهها و نمایش آنها در اپلیکیشنهای توسعه داده شده با داتنت استفاده میشود. با روشن شدن مفهوم ADO.NET، در ادامه کدهای استاندارد ADO.NET برای بازیابی دادهها از یک پایگاه داده ارائه شده است.
1var sql = "select * from products";
2var products = new List<Product>();
3using (var connection = new SqlConnection(connString))
4{
5 connection.Open();
6 using (var command = new SqlCommand(sql, connection))
7 {
8 using (var reader = command.ExecuteReader())
9 {
10 var product = new Product
11 {
12 ProductId = reader.GetInt32(reader.GetOrdinal("ProductId")),
13 ProductName = reader.GetString(reader.GetOrdinal("ProductName")),
14 SupplierId = reader.GetInt32(reader.GetOrdinal("SupplierId")),
15 CategoryId = reader.GetInt32(reader.GetOrdinal("CategoryId")),
16 QuantityPerUnit = reader.GetString(reader.GetOrdinal("QuantityPerUnit")),
17 UnitPrice = reader.GetDecimal(reader.GetOrdinal("UnitPrice")),
18 UnitsInStock = reader.GetInt16(reader.GetOrdinal("UnitsInStock")),
19 UnitsOnOrder = reader.GetInt16(reader.GetOrdinal("UnitsOnOrder")),
20 ReorderLevel = reader.GetInt16(reader.GetOrdinal("ReorderLevel")),
21 Discontinued = reader.GetBoolean(reader.GetOrdinal("Discontinued")),
22 DiscontinuedDate = reader.GetDateTime(reader.GetOrdinal("DiscontinuedDate"))
23 };
24 products.Add(product);
25 }
26 }
27}
در ابتداییترین سطح خود، Dapper قطعه کد انتسابی زیر را تنها با یک خط کد جایگزین میکند:
1 using (var command = new SqlCommand(sql, connection))
2 {
3 using (var reader = command.ExecuteReader())
4 {
5 var product = new Product
6 {
7 ProductId = reader.GetInt32(reader.GetOrdinal("ProductId")),
8 ProductName = reader.GetString(reader.GetOrdinal("ProductName")),
9 SupplierId = reader.GetInt32(reader.GetOrdinal("SupplierId")),
10 CategoryId = reader.GetInt32(reader.GetOrdinal("CategoryId")),
11 QuantityPerUnit = reader.GetString(reader.GetOrdinal("QuantityPerUnit")),
12 UnitPrice = reader.GetDecimal(reader.GetOrdinal("UnitPrice")),
13 UnitsInStock = reader.GetInt16(reader.GetOrdinal("UnitsInStock")),
14 UnitsOnOrder = reader.GetInt16(reader.GetOrdinal("UnitsOnOrder")),
15 ReorderLevel = reader.GetInt16(reader.GetOrdinal("ReorderLevel")),
16 Discontinued = reader.GetBoolean(reader.GetOrdinal("Discontinued")),
17 DiscontinuedDate = reader.GetDateTime(reader.GetOrdinal("DiscontinuedDate"))
18 };
19 products.Add(product);
20 }
21 }
قطعه کد بالا با استفاده از Dapper به خط کد زیر تبدیل میشود:
1products = connection.Query<Product>(sql);
همچنین Dapper در صورت نیاز، کار ایجاد دستور و برقراری اتصال را هم انجام میدهد. اگر از Dapper تنها برای مدیریت ابتدایی انتسابهای این چنینی استفاده شود، ساعتها در وقت صرفهجویی خواهد شد. اما در حقیقت، Dapper میتواند کارهای بیشتری را هم انجام دهد که در روند آموزش Dapper مشخص خواهند شد. در ادامه به ارائه شرحی از نحوه عملکرد Dapper پرداخته شده است.
Dapper چگونه عمل میکند؟
در خصوص نحوه عملکرد Dapper باید گفت که یک فرایند سه مرحلهای وجود دارد:
- ایجاد یک شی IDbConnection
- نوشتن یک کوئری برای اجرای عمیات CRUD
- پاس دادن کوئری به عنوان یک پارامتر در متدهای Dapper
برای درک بهتر فرایند سه مرحلهای Dapper لازم است تعاریفی از شی IDbConnection، عملیات CRUD و متدهای Dapper ارائه شود. در ادامه، ابتدا به این سوال پاسخ داده شده است که IDbConnection چیست؟
IDbConnection چیست؟
رابط IDbConnection نمایانگر اتصال باز به منبع داده است و توسط فراهمکنندگان داده داتنت پیادهسازی میشود. این فراهم کنندگان به پایگاه دادههای رابطهای دسترسی پیدا میکنند. نحوه تعریف یک IDbConnection در سیشارپ به صورت زیر است:
1public interface IDbConnection : IDisposable
در ادامه این بخش از آموزش Dapper به این سوال پاسخ داده میشود که عملیات CRUD چیست؟
CRUD چیست ؟
CRUD سرنامی برای «Create, Read, Update, and Delete» است. در برنامهنویسی، ایجاد کردن (Create)، خواندن (Read)، بهروزرسانی کردن (Update) و پاک کردن (Delete) چهار عملیات اصلی ذخیرهسازی ماندگار (Presistent Storage) به حساب میآیند.
حال نوبت به ارائه فهرستی از متدهای Dapper رسیده است.
متدهای Dapper چه هستند؟
Dapper رابط IDbConnection را با چند متد گسترش میدهد. این متدها شامل موارد زیر است:
- Execute
- Query
- QueryFirst
- QueryFirstOrDefault
- QuerySingle
- QuerySingleOrDefault
- QueryMultiple
توضیحات کامل و مثالهای متدهای Dapper در پایان مطلب ارائه شده است.
پیش نیازهای آموزش Dapper چه هستند؟
پیش از شروع آموزش Dapper باید آشنایی لازم با ASP.NET Core و مبانی Entity Framework Core وجود داشته باشد. قبل از آغاز آموزش Dapper باید نحوه ساخت یک اپلیکیشن CRUD ساده فرا گرفته شده باشد. یکی دیگر از پیشنیازهای آموزش Dapper آشنایی با نحوه ساخت اپلیکیشنهای مبتنی بر الگوی معماری MVC است.
بنابراین، فراگیری آموزش ASP.NET Core مبتنی بر MVC پیش از شروع آموزش Dapper پیشنهاد میشود. در این راستا، در انتهای مطلب آموزش Dapper برخی از دورههای آموزشی مرتبط با پیشنیازهای لازم برای آموزش Dapper معرفی شده است. اما در ادامه، ابزارها و برنامههای مورد نیاز برای یادگیری Dapper معرفی شدهاند.
ابزارهای مورد نیاز آموزش Dapper
در این بخش از مطلب آموزش Dapper تمام ابزارهایی معرفی شدهاند که در فرایند آموزش Dapper مورد نیاز خواهند بود.
Visual Studio
اولین ابزار مورد نیاز برای آموزش Dapper محیط توسعه Visual Studio 2019 است. نسخه Community نرمافزار Visual Studio 2019 کاملاً رایگان است و میتوان آن را از وبسایت رسمی دانلود و نصب کرد.
آموزش نصب در مطلب «نصب ویژوال استودیو — آموزش تصویری، گام به گام و رایگان» در دسترس است.
SQL Server
ابزار دیگری که برای آموزش Dapper مورد نیاز است، SQL Server نام دارد. برای دانلود و نصب SQL Server نیز باید به سایت رسمی آن مراجعه کرد. نسخه Developer این ابزار مدیریت پایگاه داده کاملاً رایگان است.
آموزش نصب در مطلب «آموزش نصب SQL Server 2017 در ویندوز ۱۰ — تصویری و گام به گام» قابل دسترسی است.
دات نت
برای آموزش Dapper نیاز به دانلود و نصب بسته توسعه نرمافزار داتنت (.NET 5) نیز وجود دارد.
مطابق تصویر زیر، باید نسخه متناسب با سیستمعامل را از سایت رسمی مایکروسافت داتنت دانلود کرد.
بنابراین، برای آموزش Dapper در این مطلب از Visual Studio 2019 به همراه .NET Core 5 و SQL Server استفاده شده است. با توجه به اینکه فریمورک ASP.NET یکی از مهمترین ابزارهای مورد نیاز در آموزش Dapper به شمار میرود، در ادامه مطلب آموزش Dapper نسبت به معرفی مجموعه دورههای آموزشی ASP.NET در سایت فرادرس پرداخته شده است.
معرفی فیلم های آموزش ASP.NET
همانطور که بیان شد، Microsoft .NET یکی از ابزارهای اصلی مورد استفاده در آموزش Dapper است. داتنت یک سکوی توسعه رایگان، متنباز و چندپلتفرمی برای ایجاد انواع مختلفی از اپلیکیشنها است. با .NET میتوان از چندین زبان، ویرایشگر و کتابخانه برای توسعه وباپلیکیشن، اپلیکیشنهای موبایل، دسکتاپ، بازی و اینترنت اشیا استفاده کرد. ASP.NET یک فریمورک وب متنباز است که توسط مایکروسافت برای ایجاد وباپلیکیشنها و سرویسهای وب امروزی ارائه شده است.
مجموعه آموزش برنامه نویسی ASP.NET دارای هفت دوره آموزشی مختلف پیرامون مباحث ASP.NET است. این دورهها در مجموع شامل بیش از ۴ هزار دقیقه محتوای آموزش ویدئویی میشود. برخی از دورههای این مجموعه در پایان این مطلب با توضیحات بیشتری معرفی خواهند شد. در این بخش، برخی از سایر دورههای مجموعه آموزش برنامهنویسی ASP.NET معرفی شدهاند:
- فیلم آموزش پروژه محور ASP.NET MVC - طراحی سایت فروشگاهی: طول مدت این آموزش ۱۰ ساعت و ۳۶ دقیقه و مدرس آن مهندس عباس حافظی حقانی است. هدف اصلی در این آموزش، ارائه مباحث مربوط به طراحی سایت فروشگاهی با استفاده از فریم ورک ASP.NET MVC به شمار میرود. برای دیدن فیلم آموزش پروژه محور ASP.NET MVC - طراحی سایت فروشگاهی + کلیک کنید.
- فیلم آموزش ساخت سایت فروشگاه با ASP.NET: طول مدت این دوره آموزشی ۱۴ ساعت و ۴۳ دقیقه و مدرس آن مهندس میثم حبیبی است. در این دوره، یک سایت فروشگاهی با استفاده از زبان برنامهنویسی C# در فریمورک ASP.NET WEB FORM پیادهسازی شده است. برای دیدن فیلم آموزش ساخت سایت فروشگاه با ASP.NET + کلیک کنید.
- آموزش ساخت سایت خبری با ASP.Net: طول مدت این دوره آموزشی ۱۰ ساعت و مدرس آن مهندس میثم حبیبی است. هدف از این دوره آموزشی، کمک به آشنایی با دنیای توسعه وب و به ویژه توسعه صفحات خبری است. سعی شده است تا با بهکارگیری زبان سیشارپ، بهترین و راحتترین روش برای ایجاد سایت خبری ارائه شود. برای دیدن فیلم آموزش آموزش ساخت سایت خبری با ASP.Net + کلیک کنید.
- برای دسترسی به همه دورههای آموزش ASP.Net + کلیک کنید.
در ادامه مطلب آموزش Dapper به شرح نحوه نصب Dapper پرداخته شده است.
آموزش نصب Dapper
در این بخش از آموزش Dapper نحوه نصب Dapper شرح داده شده است.
میتوان Dapper را به یکی از دو روش زیر نصب یا به پروژه اضافه کرد:
- نصب Dapper با استفاده از فایل نگاشتگر SQL
- نصب Dapper با مدیر بسته NuGet
در ادامه هر یک از این روشها شرح داده شدهاند.
نصب Dapper با استفاده از فایل نگاشتگر SQL
نصب Dapper با استفاده از فایل نگاشتگر SQL اولین گزینه برای نصب آن است. در این روش میتوان فایل را مستقیماً از پوشه پروژه Dapper و فولدر Dapper NET40 دریافت و فایل SQLMapper.cs را در پروژه کپی کرد. در واقع Dapper یک فایل واحد است و تنها با افزودن این فایل به پروژه، میتوان قابلیتهای Dapper را با استفاده از رابط IDbConnection در پروژه به کار گرفت.
نصب Dapper با مدیر بسته NuGet
یک روش ساده دیگر برای نصب Dapper و افزودن آن به پروژه، استفاده از مدیر بسته NuGet است. برای نصب Dapper با این روش، باید کنسول Nuget Package Manager را در Visual Studio باز و دستور زیر را اجرا کرد:
1Install-Package Dapper
2
اجرای دستور فوق منجر به نصب Dapper و اضافه شدن کتابخانه Dapper به پروژه خواهد شد.
در ادامه این مطلب به بحث اصلی یعنی آموزش پروژه محور Dapper از طریق تغییر پیادهسازی انجام شده با Entity Framework پرداخته شده است.
آموزش Dapper
در این بخش، آموزش Dapper و نحوه استفاده از آن در پروژه ساخت وب اپلیکیشن با معماری MVC به صورت گام به گام ارائه شده است. در این پروژه ساده، یک وباپلیکیشن ایجاد میشود که میتوان در آن مشخصات شرکتهای مختلف را اضافه، ویرایش یا حذف کرد و همچنین امکان مشاهده مشخصات هر شرکت نیز وجود دارد. مرحله اول آموزش Dapper ایجاد یک پروژه جدید ASP.NET Core Web Appliction است که در ادامه شرح داده شده است.
برای آموزش Dapper در این مطلب، جهت درک بهتر مفاهیم آموزش Dapper و پیادهسازی آن، ابتدا پیادهسازی یک پروژه ساده با استفاده از نگاشتگر شی رابطهای Entity Framework انجام شده است و پس از آن کدهای تولیدی برای پیادهسازی میکرو ORM با Dapper تغییر داده خواهند شد. این کار برای درک بهتر مفاهیم Dapper و تفاوت آن با Entity Framework صورت میگیرد. پیش از شروع ایجاد پروژه جدید در Visual Studio، لازم است پیرامون چیستی Entity Framework توضیحاتی ارائه شود. این کار در ادامه انجام شده است.
Entity Framework چیست ؟
Entity Framework ابزاری برای دسترسی به یک پایگاه داده است. همانطور که پیشتر اشاره شد، Entity Framework یک نگاشتگر شی رابطهای یا ORM به شمار میرود که برای نگاشت اشیا اپلیکیشن به دادههای رابطهای استفاده میشود. در گذشته و پیش از Entity Framework، تمام عملیات نگاشت باید به صورت دستی انجام میشد که شامل گامهای بسیاری بود. برای مثال باید یک اتصال به پایگاه داده انجام میشد، دستورات اجرا میشدند، دادهها خوانده میشدند و در نهایت قطع اتصال صورت میگرفت.
اگرچه، با معرفی ORM دیگر نیازی به انجام این مراحل وجود ندارد و کارها در سطح انتزاع بالاتری با کمک Entity Framework انجام میشوند. Entity Framework یک کلاس به نام «DbContext» فراهم میکند. کلاس DbContext دروازهای به پایگاه داده به حساب میآید. یک DbContext میتواند یک یا بیش از یک «DbSet» داشته باشد.
این DbSetها نماینده جدول در پایگاه داده هستند. برای جستجو (کوئری) این DbSetها از «LINQ» استفاده میشود. در زمان اجرا، Entity Framework این LINQها را به کوئریهای SQL ترجمه میکند. یعنی نیازی به کدنویسی عملیات ترجمه توسط برنامهنویس وجود ندارد. تمام این عملیات توسط Entity Framework در پشت صحنه انجام میشود.
بنابراین Entity Framework مسئولیت برقراری اتصال به پایگاه داده، خواندن دادهها، نگاشت دادهها به اشیا، افزودن دادهها به DbSetها و بازگرداندن DbContext به توسعهدهنده را برعهده دارد. با افزودن، ویرایش و حذف کردن اشیا در DbSetها، Entity Framework تغییرات را پایش و برای اعمال این تغییرات، گزارههای SQL را به صورت خودکار تولید و آنها را روی پایگاه داده اجرا میکند. با مشخص شدن چیستی Entity Framework، در ادامه روند آموزش Dapper با ایجاد یک پروژه جدید آغاز میشود.
ایجاد یک پروژه جدید
اولین کاری که باید انجام شود، ایجاد یک پروژه جدید در Visual Studio است. با کلیک روی گزینه «Create a New Project»، انتخاب «ASP.NET Core Web Appliction» و زدن Next به صفحه بعدی منتقل شده و در آنجا باید نام پروژه و محل ذخیره آن را تنظیم کرد. میتوان پروژه را «Dapper Demo» نامگذاری کرد. با زدن دکمه Create صفحه دیگری ظاهر میشود که دارای انتخابهای بیشتری برای تنظیم است.
در این صفحه چندان نیازی به تغییر تنظیمات نخواهد بود و تنها انتخاب وب اپلیکیشن MVC و فعال کردن گزینه «Enable Runtime Compilation» کافی است. گزینه «Enable Runtime Compilation» برای این منظور فعال میشود که در صورت اعمال تغییرات در زمانی که اپلیکیشن در حال اجرا است، بدون نیاز به بارگذاری مجدد اپلیکیشن بتوان تغییرات را مشاهده کرد. به این ترتیب، با زدن دکمه Create پروژه جدید برای آموزش Dapper ایجاد میشود.
با ایجاد شدن پروژه، فایلها و فولدرهای مربوط به پروژه Dapper Demo از جمله فولدرهای سه لایه MVC شامل مدل، نما، کنترلر و فایلهای Program.cs ،Appsettings.json ،Startup.cs و wwwroot که حاوی فایلهای ایستای CSS، جاوا اسکریپت و سایر موارد است، در Solution Explorer قابل ملاحظه هستند. این ساختار در یک اپلیکیشن مبتنی بر MVC بسیار رایج است.
همانطور که در بخش پیشنیازهای آموزش Dapper بیان شد، نیاز است تا آشنایی با الگوی معماری MVC و توسعه وباپلیکیشنهای مبتنی بر MVC در ASP.NET Core وجود داشته باشد. بنابراین، فرض میشود که فراگیر آشنایی لازم را در این خصوص دارد. به این ترتیب، نوبت به مرحله بعدی آموزش Dapper یعنی افزودن Entity Framework در پروژه میرسد که در ادامه مطلب آموزش Dapper به آن پرداخته شده است.
افزودن Entity Framework به پروژه
پیش از کار با Dapper، در این بخش یک انباره (Repository) با Entity Framework تنظیم میشود. بنابراین، کاری که در ابتدا انجام میشود، ایجاد یک اپلیکیشن ساده با استفاده از Entity Framework است. سپس ویرایشها و تغییرات لازم برای استفاده از Dapper انجام خواهد شد تا درکی از تغییرات مورد نیاز به دست آید. با استفاده از فریمورک Entity ایجاد مدلها یا پایگاه داده بسیار ساده خواهد بود. اولین مسئله در خصوص Entity Framework این است که باید مدلها را ایجاد کرد.
ایجاد مدلها در Entity Framework
بنابراین، دو مدلی که در این پروژه روی آنها کار خواهد شد در اینجا باید اضافه شوند. برای اضافه کردن یک کلاس جدید، باید روی فولدر Models در Solution 'DapperDemo' راست کلیک و در زیرمنوی «Add» گزینه «Class» را باز کرد. در پنجره باز شده، اولین مدل مورد نیاز، «Company Model» است که باید انتخاب و اضافه شود. کلاس Company یک کلاس عمومی است. میتوان به فرض شش خصیصه (Property) در کلاس Company تعریف کرد. کدهای کلاس Company به همراه شش Property آن به صورت تصویر زیر است:
اولین خصیصه کلاس شرکت، «CompanyId» است. در فریمورک Entity در صورتی که نام یک Property به «Id» ختم شود، آن خصیصه به عنوان یک کلید اصلی (Primary Key) اضافه خواهد شد. بنابراین، نیازی به مشخص کردن کلید اصلی نیست؛ اما در صورت تمایل میتوان با فشردن کلیدهای ترکیبی «Ctrl + نقطه» از برچسبنویسی داده کلید استفاده کرد. سایر خصیصهها در کلاس Company شامل نام شرکت، نشانی، شهر، استان و کد پستی است. در مرحله بعدی باید این کلاس را به پایگاه داده اضافه یا Push کرد.
Push کردن کلاس در پایگاه داده
برای Push کردن باید یک رشته اتصال (String Connection) در پروژه اضافه شود. این کار در فایل «appsettings.json» انجام میشود. پیش از آن، باید وارد برنامه استودیو مدیریت SQL Server شده و با باز کردن بخش «Connect to Server» به یک سرور SQL متصل شد.
برای انجام این کار باید گزینه نام سرور را روی «(LocalDB)/MSSQLLocalDB» قرار داد. همچنین، گزینه «Authentication» نیز باید روی گزینه «Windows Authentication» قرار داده شود. با زدن دکمه «Connect»، اتصال به پایگاه داده انجام میشود. حال باید یک پایگاه داده جدید برای اپلیکیشن در حال توسعه ایجاد شود. به Visual Studio بازگشتنه و در فایل «appsettings.json» باید پارامتری به نام «ConnectionStrings» به صورت تصویر زیر اضافه شود:
همانطور که در تصویر بالا ملاحظه میشود، در داخل پارامتر «ConnectionStrings» یک اتصال پیش فرض وجود دارد. نام سرور در اتصال پیشفرض باید دقیقاً همان نامی باشد که در زمان اتصال به سرور SQL استفاده شد. نام پایگاه داده هم همان نام پایگاه داده جدیدی خواهد بود که قصد ایجاد آن وجود دارد. گزینه «Trusted_Connection» در اتصال پیش فرض نیز مقدار «True» را دارد؛ زیرا به جای نام کاربری و کلمه عبور، قصد استفاده از «Windows Authentication» وجود دارد. به این ترتیب رشته اتصال در فایل «appsettings.json» تنظیم شده است. اکنون برای اضافه کردن کلاس Company به پایگاه داده، باید تعدادی از بستههای Nuget را اضافه کرد.
افزودن بستههای Nugget
حال باید چارچوب Entity را در اپلیکیشن تنظیم کرد. بنابراین، به منو Tools رفته، وارد زیرمنوی NuGet Package Manager شده و بعد باید روی Manage NuGet Packages for Solution کلیک کرد. در صفحه باز شده، باید در قسمت Browse عبارت Entity Framewok Core را جستجو کرد. برای نصب Microsoft Entity Framewok Core باید یک فراهم کننده مانند SQL Server یا هر فراهم کننده دیگری را نصب کرد که تحت پشتیبانی باشد. بنابراین، به جای نصب Entity Framewok Core، بهتر است مستقیماً نسبت به نصب بسته Microsoft.EntityFrameworkCore.SqlServer اقدام شود.
دسترسی به این بسته از طریق جستجوی عبارت «sqlserver» امکانپذیر است. علاوه بر نصب بسته Microsoft.EntityFrameworkCore.SqlServer، با توجه به اینکه در طول پروژه عملیات نقل مکان (Migration) نیز افزوده خواهد شد، نیاز به نصب بسته Microsoft.EntityFrameworkCore.Tools نیز وجود خواهد داشت. در این مقطع از آموزش Dapper نصب بستهها در همین حد کافی است. در صورت نیاز به نصب بستههای بیشتر، مجدداً به بخش مدیریت بسته NuGet مراجعه خواهد شد. اکنون رشته اتصال آماده است و در ادامه باید فایل کلاس Startup را تنظیم کرد.
تنظیم فایل کلاس Startup
برای تنظیم فایل کلاس Startup باید فایل Startup.cs را در Solution Explorer باز کرد. در صورتی که نیاز به انجام تنظیماتی وجود داشته باشد که در اپلیکیشن مورد استفاده قرار میگیرد، این تنظیمات باید در متُد Configure Service انجام شود. در این متُد باید یک اتصال دهنده پایگاه داده برای Entity Framework Core اضافه شود. برای این کار، باید یک کلاس DbContext در پروژه ایجاد شود. برای ایجاد کلاس DbContext، باید روی نام پروژه (DapperDemo) در Solution Explorer راست کلیک و یک فولدر جدید ایجاد کرد.
میتوان نام این فولدر را «Data» گذاشت. حال در داخل این فولدر باید یک کلاس DbContext اضافه شود. برای انجام این کار باید روی فایل Data راست کلیک کرده و در زیر منوی Add گزینه Class را باز کرد. میتوان نام کلاس را ApplicationDbContext گذاشت. با زدن دکمه Add، فایل کلاس ApplicationDbContext در پوشه Data اضافه میشود. در داخل کلاس ApplicationDbContext، باید با افزودن کدهای لازم اطمینان پیدا کرد که ApplicationDbContext از کلاس DBContex ارث بری کرده و آن را پیادهسازی میکند. کلاس DBContex در داخل بسته Microsoft Entity Framewok Core موجود است. برای انجام این کار باید یک Constructor را به صورت زیر ثبت کرد:
1public ApplicationDbContext (DbContexOptions<ApplicationDbContext> options) : base(options)
2{
3
4}
به این ترتیب، تنظیمات ابتدایی مورد نیاز برای Entity Framework Core انجام شد. حال هر زمان نیاز به افزودن یک جدول به پایگاه داده وجود داشته باشد، میتوان از ApplicationDbContext استفاده کرد. به عنوان مثال در صورتی که قصد افزودن مدل Company به پایگاه داده وجود داشته باشد، خط کد زیر در کلاس ApplicationDbContext اضافه میشود:
1public DbSet<Company> Companies { get; set; }
در خط کد بالا، یک خصیصه از نوع DbSet در مدل Company تعریف شده است. «Companies» نامی خواهد بود که در پایگاه داده به جدول مربوطه اختصاص داده میشود. در حال حاضر، هنوز جدولی به نام Companies در پایگاه داده اضافه نشده است. کدهای کلاس ApplicationDbContext به صورت تصویر زیر است:
تنظیم متد ConfigureServices
آخرین کاری که باید انجام شود تا بتوان از همه آنچه ایجاد شده استفاده کرد، تنظیم کلاس Startup است. برای تهیه نمونهای (Instance) از DbContext، باید از رشته اتصالی استفاده کرد که قبلاً تنظیم شده است. در واقع، همه چیز در فایل Startup.cs به یکدیگر پیوند داده میشود. بنابراین، باید تنظیمات لازم را در متُد ConfigureServices انجام داد. تنظیمات کلاس DbContext روی شی Services به صورت زیر انجام میشود:
1public void ConfigureServices(IserviceCollection services)
2{
3 services.AddDbContext<ApplicationDbContext>(options=>)
4 options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
5
6 services.addControllersWithViews();
7}
در کدهای بالا، متد AddDbContext روی ApplicationDbContext اعمال شده و تنظیمات آن انجام میشود. تنظیمات اصلی برای DbContext، اتصال آن به SQL Server است. options.UseSqlServer() به اپلیکیشن میگوید که از SQL Server استفاده خواهد شد. وقتی از SQL Server استفاده میشود، باید رشته اتصال را در options.UseSqlServer() فراخوانی کرد. میتوان با استفاده از شی Configuration و متدی به نام GetConnectionString این کار را انجام داد.
در متد GetConnectionString باید نام رشته را ارجاع داد. همانطور که پیش از این بیان شد، نام رشته اتصال DefaultConnection است. به این ترتیب، همه چیز در تنظیمات DbContext انجام شده است. همانطور که قبلاً بیان شد، در ApplicationDbContext، از خصیصه DbSert برای افزودن جدول Companies استفاده شد. اما هنوز پایگاه دادهای وجود ندارد. برای این کار باید Migrations را اضافه کرد. در ادامه آموزش Dapper به این موضوع پرداخته شده است.
افزودن جدول به پایگاه داده
تمام آنچه باید انجام شود این است که جدول Companies را به پایگاه داده اضافه کرد. برای این انجام این کار باید به منو Tools رفته و در زیر منوی NuGet Package Manager کنسول Package Manager را باز کرد. باید در این کنسول دستوراتی را وارد و اجرا کرد تا بتوان به طور دستی Migration را اجرا یا اضافه کرد. اولین دستور به صورت زیر است:
1add-migration AddCompaniesToDb
در دستور بالا، یک Migration با نام AddCompaniesToDb افزوده شده است. با زدن کلید Enter و اجرای دستور بالا یک اسکریپت ایجاد میشود که بعداً در زمان لازم اجرا خواهد شد. میتوان ملاحظه کرد که این اسکریپت در فولدر Migrations اضافه شده است. کدهایی که به صورت خودکار در این اسکریپت تولید شدهاند، در تصویر زیر نشان داده شده است:
تمام آنچه در کدهای بالا انجام شده، ایجاد یک جدول به نام Companies است و تعریف ستونهایی که پیشتر در کلاس Company اضافه شد. همچنین به این دلیل که نام ستون CompanyId به «Id» ختم میشود، این ستون در خط ۲۳ به عنوان کلید اصلی تعریف شده است. برای ایجاد جدول Companies باید به کنسول مدیریت بسته رفته و دستور بهروزرسانی پایگاه داده را به صورت زیر وارد کرد:
1update-database
این کار، Migration ایجاد شده را به پایگاه داده Push خواهد کرد. اگر به استدیو مدیریت SQL Server مراجعه شود، در ابتدا هیچ پایگاه دادهای به نام Dapper وجود ندارد. کاری که انجام میشود این است که اول یک پایگاه داده، در صورت عدم وجود، ایجاد میشود و سپس دستورات مورد نظر اجرا خواهند شد. با تازهسازی Object Explorer در SQL Server Managment Studio، ملاحظه میشود که پایگاه دادهای به نام «dapper» اضافه شده است. اگر در داخل پایگاه داده dapper به پوشه Tables مراجعه شود، جدول Companies به نام dbo.Companies قابل ملاحظه خواهد بود:
همچنین، همانطور که در تصویر بالا مشخص شده است است، فایل دیگری به نام «dbo._EFMigrationsHistory» نیز در پوشه جداول وجود دارد. این فایل تنها برای ردیابی Migrationهایی است که با استفاده از دستورات در Entity Framework به پایگاه داده Push میشوند. در صورت تمایل، این امکان وجود دارد که جدول Companies و پایگاه داده به صورت مستقیم ایجاد شوند. اما در اینجا هدف، آموزش انجام این کار با Entity Framework است. همچنین در ادامه، انجام همین فرآیند (هر نوع عملیات CRUD) با Dapper آموزش داده خواهد شد. به این ترتیب، زیربنای لازم برای یک جدول ایجاد شد. در ادامه، از چارچوب Entity برای اجرای عملیات CRUD استفاده شده است.
عملیات CRUD با چارچوب Entity
اکنون جدول مربوطه ایجاد شده است و در این بخش، عملیات CRUD در جدول Companies با استفاده از فریمورک Entity انجام میشود. بنابراین قصد ایجاد، ویرایش، حذف و مشاهده جزئیات شرکتها در جدول Companies وجود دارد.
این کار را میتوان به راحتی با استفاده از Entity Framework انجام داد. برای انجام عملیات CRUD، با راست کلیک کردن روی پوشه Controller در Solution Explorer، باید در زیرمنوی Add گزینه Controller را باز کرد تا صفحه زیر ظاهر شود:
همانطور که در تصویر فوق پیداست، گزینه سوم، «امکان استفاده از کنترلر MVC به همراه نما با به کارگیری Entity Framework» است. بنابراین، باید گزینه «MVC Controller with views, using Entity Framework» را انتخاب کرده و دکمه Add را زد. در پنجره بعدی میتوان یک کلاس مدل را انتخاب کرد. در آن صفحه، باید مدل کلاس Company انتخاب شود. برای کلاس «Data Context» نیز باید ApplicationDbContext را انتخاب کرد. به طور کلی، تنظیمات صفحه افزودن کنترلر MVC دارای نما با استفاده از فریمورک Entity به صورت تصویر زیر است:
پس از انجام تنظیمات لازم مطابق تصویر فوق، باید دکمه Add را زد. ایجاد این کنترلر ممکن است زمانبر باشد زیرا نیاز به نصب تعدادی بسته NuGet برای ایجاد چارچوب طراحی و نماها وجود دارد. پس از پایان پروسه ایجاد کنترلر Company، به پوشه View در Solution Explorer رفته و باید در داخل آن فایل نمای والد ((_Layout.cshtml را باز کرد. در این فایل، باید کدهای نوار Privacy را تغییر داد. این کدها پیش از تغییر به صورت زیر است:
به جای Action برای Privacy باید به Index Action کنترلر جدیدی که پیشتر ایجاد شد (کنترلر Companies) ارجاع داده شود. کدهای تغییر داده شده به صورت زیر است:
1<a class="nav-link text-dark" asp-area="" asp-controller="companies' asp-action="Index"> Company </a>
اکنون میتوان نتیجه کار را در خروجی بررسی کرد. تصویر زیر صفحه اصلی وباپلیکیشن ایجاد شده را نمایش میدهد:
همانطور که در تصویر فوق ملاحظه میشود، سومین سربرگ در قسمت بالا و سمت چپ این وباپلیکیشن، Company نام دارد و با کلیک کردن آن، میتوان به جدول Company دسترسی پیدا کرد و فیلدهای جدیدی به آن اضافه کرد. همچنین میتوان فیلدها را ویرایش یا حذف و محتوای هر فیلد را مشاهده کرد:
به این ترتیب عملیات CRUD با Entity Framework به صورت خودکار پیادهسازی شده است. اما برای استفاده از Dapper به جای فریمورک Entity، ابتدا باید تغییراتی در پیادهسازی Entity Framework انجام شود. در ادامه آموزش Dapper به اعمال این تغییرات پرداخته خواهد شد. برای اعمال تغییرات لازم، نیاز است توضیحاتی پیرامون نحوه عملکرد و سازِکار پیادهسازی انجام شده با Entity ارائه شود.
نحوه عملکرد کنترلر خودکار Entity
با پیادهسازی ساختار Entity، به صورت خودکار یک کنترلر برای Company ایجاد شد.
در این کنترلر از ApplicationDbContext با به کار گیری تزریق وابستگی (Dependancy Injection) استفاده شد:
برای پیادهسازی فرآیند دریافت دادهها یا GET در عملیات CRUD، تمام شرکتها از پایگاه داده بازیابی میشوند. در بخش Details متد GET، بر اساس شناسه یک شرکت به خصوص بازیابی شده و در نما نمایش داده میشود. کدهای مربوط به عملیات GET در کنترلر Companies در تصویر زیر قابل مشاهده است.
همانطور که در تصویر زیر نمایش داده شده است، در متد Create از عملیات GET، نیاز به انجام کار خاصی وجود ندارد؛ زیرا Textboxها خالی خواهند بود.
برای ایجاد یک فیلد (شرکت) جدید در بخش POST از کنترلر Companies، تمام دادههایی که وارد شده بازیابی و توسط Entity Framework در جدول Companies در پایگاه داده اضافه میشوند.
همانطور که در تصویر فوق قابل ملاحظه است، افزودن فیلد با Entity Framework به صورت زیر انجام میشود:
1_context.Add(company);
2await _context.SaveChangesAsync();
عملیات ویرایش (Edit) نیز تقریباً مشابه Create است. اما در ویرایش، باید شرکت مربوطه را از پایگاه داده بازیابی کرد. بنابراین در DbContext از متد FindAsync برای پیدا کردن فیلد مربوطه به وسیله کلید اصلی (id) استفاده میشود. وقتی فیلد مربوطه دریافت شد، آن را بازیابی کرده و برای نمایش آن، به View ارجاع داده میشود. کدهای مربوطه در تصویر زیر نشان داده شده است:
برای عملیات ویرایش در متُد POST، بازیابی انجام شده و به جای متُد افزودن، از فراخوانی Update روی DbContext استفاده و سپس تغییرات ذخیره میشوند. کدهای مربوط به این بخش در تصویر زیر آمده است:
آخرین عملیات مربوط به قابلیت حذف کردن (Delete) است. در این عملیات، شرکتی بازیابی میشود که کاربر انتخاب میکند و قصد حذف آن را دارد. جزئیات آن در View نمایش داده میشود و وقتی که کاربر دکمه Delete را میزند، آن فیلد Company مجدد بازیابی شده و با استفاده از Entity Framework Core حذف میشود. کدهای مربوط به عملیات حذف در تصویر زیر آمده است:
به این ترتیب مروری اجمالی بر عملیات CRUD در کنترلر ارائه شد. در ادامه مطلب آموزش Dapper نوبت به انجام تغییراتی در کدها برای استفاده از Dapper به جای Entity Framework میرسد.
تغییر کدها برای پیادهسازی Dapper
تغییراتی لازم به این صورت است که باید Entity Framework Core را در داخل یک Repsitory ایزوله کرد تا بتوان در آینده تغییر Repository را به راحتی انجام داد. این کار در ادامه انجام شده است.
ایزوله کردن Entity در یک Repository
اکنون، عملیات CRUD موجود است و همچنین Entity Framework تمام Viewهای مربوط به CRUD را برای کلاس Companies ایجاد کرده است. این مسئله را میتوان در تصویر زیر ملاحظه کرد:
جهت ایزوله کردن DbContext برای Entity Framework در Repository مربوط به خودش، باید در پوشه مربوط به پروژه Dapper یک پوشه جدید ایجاد کرد و میتوان آن را «Repository» نامید. حال باید یک رابط (Interface) در Repository ایجاد شود و میتوان نام آن را «ICompanyRepository» گذاشت. این رابط باید یک رابط عمومی باشد. اما چه متدهایی در این رابط مورد نیاز است؟ باید تمام قابلیتها و ویژگیهای CRUD در این رابطه پیادهسازی شود:
- ابتدا نیاز به یک متد جستجو (Find) وجود دارد. این متد بر اساس شناسه، شرکت مورد نظر را پیدا کرده و آن را باز میگرداند. بنابراین نوع بازگشتی، مدل Company و نام تابع، Find خواهد بود. پس از یافتن شرکت، باید اطلاعات آن بازگردانده شود.
- در واقع باید لیست Company بازگردانده شود که میتوان متد آن را GetAll() نامید. به بیان ساده، این متُد تمام اطلاعات شرکت مربوطه را بازیابی میکند.
- در ادامه باید یک قابلیت عملکردی اضافه شود تا شی Company را بازگرداند. میتوان چنین متدی را Add نامید که پارامتری به نام Company را دریافت خواهد کرد. یعنی یک شی Company دریافت کرده و به پایگاه داده اضافه (Add) میشود. سپس شی Company بازگرداننده میشود، اما این بار شناسه آن با شناسه جدیدی جایگزین میشود که در پایگاه داده ایجاد شده است.
- در این مرحله باید عملیات بهروزرسانی را پیادهسازی کرد. متد Update دقیقاً مشابه Add است، با این تفاوت که به جای افزودن، کار بهروزرسانی انجام میشود.
- در آخر باید یک متد برای حذف فیلدها پیادهسازی کرد. متد Remove بر اساس شناسه شرکت، آن را از پایگاه داده حذف خواهد کرد.
بنابراین، پنج متدی که در بالا شرح داده شد به عنوان متدهای CRUD عمل خواهند کرد. تصویر مربوط به کدهای تعریف متدهای CRUD در رابط ICompanyRepository در ادامه آمده است:
حال چگونه باید متدهای بالا را پیادهسازی کرد؟ ادامه آموزش Dapper به این موضوع اختصاص داده شده است.
پیاده سازی متدهای CRUD
برای پیادهسازی متدهای CRUD که در رابط ICompanyRepository تعریف شدند، باید یک فایل کلاس جدید در پوشه Repository ایجاد کرد. در واقع با این کار یک پیادهسازی برای Repository شی Company ایجاد میشود. در اینجا این فایل «CompanyRepositoryEF» نامیده شده است.
حال باید در فایل CompanyRepositoryEF.cs یک کلاس عمومی با همان نام ایجاد کرد. برای پیادهسازی رابط، میتوان مطابق تصویر زیر مکاننما را روی ICompanyRepository نگه داشت و دکمه «Show Potential Fixes» را زد. سپس، گزینه «implement Interfaces» را انتخاب کرد.
به این ترتیب، کدهای مربوط به تعریف متدهایی که باید پیادهسازی شوند در کلاس CompanyRepositoryEF ایجاد میشود. کدهای ایجاد شده در تصویر زیر آمده است:
پیش از هر چیز، در صورتی که به فایل کنترلر Companies مراجعه شود، میتوان ملاحظه کرد که برای اجرای تمام عملیات از متد ApplicationDbContext استفاده میشود. بنابراین میتوان آن را کپی کرده و در کلاس CompanyRepositoryEF قرار داد. پس از آن، باید نام Constructer را تغییر داد و با قرار دادن مکان نما روی ApplicationDbContext و با استفاده از کلیدهای میانبر «کنترل+نقطه»، DapperDemo.Data را شامل کرد (Include):
سپس باید عبارت Context در ApplicationDbContext را به صورت زیر به db تغییر داد:
حال میتوان تمام عملیات را روی این «db» اجرا کرد. اولین کاری که باید انجام شود، افزودن یک شرکت است. بنابراین، متد Add به صورت زیر نوشته میشود:
1public Company Add(Company company)
2{
3 _db.Companies.Add(company);
4 _db.SaveChanges();
5 return company;
6}
مرحله بعد، یافتن Company بر اساس شناسه است. بنابراین، برای انجام این کار، در Entity Framework Core متد Find() وجود دارد و تنها باید شناسه را به آن ارجاع داد. این متد هر آنچه دریافت شود را باز میگرداند:
1public Company _db.Companies.Finf(id);
2{
3 return _db.Companies.Find(id)
4}
علاوه بر Find میتوان از متد «FirstOrDefault» نیز استفاده کرد:
1public Company Find(int id)
2{
3 return_db.Companies.FirstOrDefault(u=>u.CompanyId==id);
4}
هر دو روش به درستی عمل خواهند کرد و میتوان از هر کدام از آنها استفاده کرد. سپس نوبت به نوشتن کدهای مربوط به لیست GetAll() میرسد. کدهای مربوط به این لیست به صورت زیر است:
1public List<company> GetAll()
2{
3 return _db.Companies.Tolist();
4}
در کدهای بالا db.Companies با متد Tolist به لیست تبدیل شده و بازگرداده میشود. سپس باید کدهای مربوط به پیادهسازی عملیات حذف کردن را نوشت. کدهای مربوط به این بخش در ادامه آمده است:
1public void Remove(int id)
2{
3 company company = _db.Companies.FirstOrDeffault(u => u.CompanyId == id);
4 _db.Companies.Remove(company);
5 _db.SaveChanges();
6 return;
7}
برای انجام عملیات حذف کردن باید ابتدا شی Company را از پایگاه داده بازیابی کرد. بنابراین میتوان همان عملیات Condition که با استفاده از firstOrDefault برای جستجو استفاده شد را برای بازیابی شی به کار گرفت. پس از بازیابی، برای پاک کردن باید شی Company را به متد Remove() ارجاع داد. پس از پاک کردن هم نیاز به ذخیرهسازی تغییرات وجود دارد. نیازی به ارجاع چیزی در اینجا وجود ندارد و تنها با دستور return بازگشت انجام میشود. آخرین متد مربوط به بهروزرسانی است. این متد دقیقاً مشابه Add است و تنها نام آن به Update تغیر میکند. کدهای پیادهسازی عملیات بهروزرسانی در ادامه آمده است:
1public Company Update(Company company)
2{
3 _db.Companies.Update(company);
4 _db.SaveChanges();
5 return company;
6}
به این ترتیب، فایل Repository برای Entity Framework کامل شده است. کاری که در ادامه انجام خواهد شد به این صورت است که در کنترلر Companies باید به جای استفاده مستقیم از ApplicationDbContext، از Repository استفاده کرد.
استفاده از Repository در کنترلر Companies
به این ترتیب در این بخش از آموزش Dapper، نحوه استفاده مستقیم از ICompanyRepository در کنترلر Companies به جای ApplicationDbContext آموزش داده شده است.
برای انجام این کار، در فایل CompaniesController باید نام ApplicationDbContext را به ICompanyRepository تغییر داد و Context هم به «compRepo» تغییر میکند. کدهای مربوطه به صورت زیر است:
برای پیادهسازی ICompanyRepository باید کدهای زیر را در فایل Startup.cs اضافه کرد:
در این مرحله باید همه متدها در کنترلر Companies را برای استفاده از Repository بهروزرسانی و ویرایش کرد. بنابراین، ابتدا در جایی که باید تمام اشیا (شرکتها) بازیابی شوند (GET)، کدها به صورت زیر تغییر میکنند:
سپس در بخش عملیات مربوط به جزئیات (Companies/Details/S) باید متد شی را بر اساس شناسه آن بازیابی کرد. در compRepo متد Find پیادهسازی شده است که ورودی id را دریافت میکند. بنابراین، کدهای مربوط به بخش Details در کنترلر Companies و تعریف شی Company به صورت زیر تغییر میکند:
سپس باید کدهای مربوط به متُد POST را تغییر داد. در بخش Create، بر اساس مقادیری که Bind میشوند، باید شی را اضافه (Add) کرد. بنابراین، کدهای مربوط به متد Add در عملیات Create به صورت زیر تغییر داده میشوند:
سپس، در بخش ویرایش متُد GET در کنترلر Companies هم باید از متد Find استفاده شود:
پس از آن، به بخش POST از عملیات ویرایش (Edit) رفته و در بخشی که بهروزرسانی انجام میشود، باید کدهای مربوطه را حذف کرده و بهروزرسانی را با استفاده از متد Update در Repository شرکت به صورت زیر انجام داد:
بخش مربوط به حذف کردن در متُد GET نیز به صورت زیر تغییر میکند:
به این ترتیب، تغییرات لازم در کنترلر Companies برای استفاده از Repository به جای ApplicationDbContext اعمال شده است و با اجرای مجدد اپلیکیشن، همه چیز باید مثل گذشته به درستی کار کند. بنابراین، یک Repository برای Entity Framework ایجاد و پیادهسازی شده است. در ادامه آموزش Dapper اعمال تغییرات لازم برای به کارگیری Dapper انجام خواهد شد.
استفاده از Dapper
برای تغییر کدها و استفاده از Dapper به جای Entity Framework، اولین کاری که باید انجام شود نصب بسته Dapper است.
بنابراین، در Nuget Solution با جستجو عبارت «Dapper» باید بسته Dapper را انتخاب و تیک Project و DapperDemo را مطابق تصویر فعال کرده و دکمه Install را زد.
پس از کامل شدن نصب بسته Dapper، باید یک Repository جدید را ایجاد کرد. این Repository همه چیز را با استفاده از Dapper پیادهسازی خواهد کرد. میتوان یک نسخه کپی از فایل CompanyRepository.EF را ایجاد کرد و نام آن را به «CompanyRepository» تغییر داد. در داخل فایل نیز باید نام کلاس و سازنده (Constructor) را به CompanyRepository تغییر داد.
منطق مربوطه در این Repository به طور کامل تغییر خواهد کرد. بنابراین همه کدهای هر یک از متدهای تعریف شده باید حذف و مجدد با استفاده از Dapper نوشته شوند. باید کدهای مربوط به کلاس ApplicationDbContext را هم حذف کرد، چون دیگر از این کلاس استفاده نخواهد شد. برای استفاده از Dapper باید یک اتصال SQL جدید ایجاد شود. برای ایجاد اتصال SQL، نیاز به رشته اتصال (String Connection) وجود دارد. در فایل Startup رشته اتصال با استفاده از Configuration.GetConnectionString به کار گرفته شده است:
باید شرایطی وجود داشته باشد تا شی Configuration در CompanyRepository به رشته اتصال در داخل تنظیمات اپلیکیشن دسترسی پیدا کند. وقتی رشته اتصال دریافت شود، باید آن را به یک اتصال IDbconncetion خصوصی نسبت داد. بنابراین، در فایل CompanyRepository یک IDbConnection خصوصی ایجاد میشود که میتوان نام آن را db گذاشت. با استفاده از تزریق وابستگی باید شی IConfiguration را دریافت کرد که میتوان آن را configuration نامید. باید this.db را در Constructor به یک اتصال SQL جدید ارجاع داد. اتصال SQL در Microsoft.Data.SqlClient موجود است، بنابراین فضای نام مربوطه اضافه شده و در داخل آن باید رشته اتصال را فراخوانی کرد.
رشته اتصال را میتوان با استفاده از شی Configuration به دست آورد. باید متد GetConnectionString را روی شی configuration اعمال کرد. کدهای مربوطه در تصویر فوق قابل ملاحظه است. به این ترتیب یک اتصال جدید پایگاه داده ایجاد شده است. با دریافت شی db میتوان تمام متدها را روی آن با استفاده از Dapper فراخوانی کرد. حال زمان کدنویسی متدهای CompanyRepository فرا رسیده است. در ادامه آموزش Dapper، کدنویسی متُد GetAll() انجام شده است.
متد GetAll()
باید مشابه SQL Server، کوئریهای SQL نوشته شوند. در این بخش به ادامه آموزش و پیادهسازی Dapper Repository پرداخته شده است. باید از کوئری «SELECT * FROM Companies» در متُد GetAll() استفاده کرد. این کار چگونه انجام میشود؟ ابتدا باید یک متغیر به نام «sql» تعریف شود و سپس کوئری SQL را در داخل آن ذخیره کرد.
سپس با اجرا شدن این کوئری، متد GetAll() باید هر آنچه که از پایگاه داده دریافت میشود (که یک لیست از Company خواهد بود) را با دستور return بازگرداند. کدهای مربوط به متد GetAll() در ادامه آمده است:
1public List<Company> GetAll()
2{
3 var sql = "SELECT * FROM Companies";
4 return db.Query<Company>(sql).ToList();
5}
در خط چهارم از کدهای بالا از متُد Query استفاده شده است. Query یکی از متُدهای بسته Dapper است. باید نوع بازگشتی را به این متُد ارجاع داد. وقتی یک دستور SQL اجرا میشود، یک لیست از Company بازگردانده میشود که از نوع کلاس company است. پس از مشخص کردن نوع بازگشتی، کوئری مربوطه باید فراخوانی شود. این کوئری در خط سوم و متغیر sql ذخیره شده است.
سپس هر آنچه که به دست میآید با استفاده از متد ToList() به لیست تبدیل میشود. بنابراین، در این بخش از آموزش Dapper، کدهای SQL لازم با استفاده از Dapper برای انتخاب تمام شرکتها از پایگاه داده و بازیابی آنها بازگردانده شده است. برای آزمایش صحت کدها، ابتدا باید کدنویسی سایر متدها را نیز انجام داد. در ادامه آموزش Dapper، کدهای مربوط به متد Find شرح داده شده است.
پیادهسازی متد Find
کوئری پایگاه داده برای عملیات جستجو به صورت زیر است:
1SELECT * FROM Companies WHERE CompanyId = @Id
کوئری فوق باید در متد Find از فایل CompanyRepository استفاده شود. مشابه متد GetAll() میتوان برای استفاده از این کوئری، آن را در یک متغیر به نام «sql» ذخیرهسازی کرد. تفاوتی که در اینجا وجود دارد این است که باید شناسه را به این کوئری ارجاع داد. میتوان هر نام دلخواهی را برای پارامتر شناسه انتخاب کرد. به عنوان مثال میتوان آن را «CompanyId» نامید. کدهای مربوط به متد Find به صورت زیر است:
1public Company Find(int id)
2{
3 var sql = "SELECT * FROM Companies WHERE CompanyId = @CompanyId";
4 return db.Query<Company>(sql,new {@CompanyId=id}).Single();
5}
در اینجا هم از متد Query در بسته Dapper برای ارتباط با پایگاه داده و انجام کوئری در آن استفاده میشود. نوع بازگشتی نیز company خواهد بود. کوئری ذخیره شده در متغیر sql توسط متد Query اجرا میشود. اما این بار به همراه sql پارامترهایی هم وجود دارد. باید یک شی جدید ایجاد شده و نام آن پارامتر هم مشخص شود. نام پارامترها در کوئری CompanyId است و مقداری که باید برای CompanyId فراهم شود نیز id است. برای اینکه دستور مقدار بازگشتی به جای لیست یک شی باشد، از متد Single() استفاده شده است. به این ترتیب نحوه پیادهسازی متد Find با استفاده از Dapper در این بخش از آموزش Dapper ارائه شد. در ادامه، بر افزودن شرکت جدید یعنی متد Add تمرکز شده است.
پیادهسازی عملیات افزودن
در این بخش از آموزش Dapper پیادهسازی متد Add و افزودن یک رکورد جدید به پایگاه داده انجام شده است. برای عملیات افزودن، دو کوئری پایگاه داده به صورت زیر وجود دارد:
1INSERT INTO Companies (Name, Address, City, State, PostalCode) VALUES(@Name, @Address, @City, @State, @PostalCode);
2SELECT CAST(SCOPE_IDENTITY() as int);
در متد Add نیز مشابه مراحل انجام شده برای پیادهسازی دو متد قبلی GetAll() و Find()، دو کوئری بالا نیز در متغیر sql قرار داده میشوند.
1var sql = "INSERT INTO Companies (Name, Address, City, State, PostalCode) VALUES(@Name, @Address, @City, @State, @PostalCode);"
2 + " SELECT CAST(SCOPE_IDENTITY() as int)";
بهتر است توضیحات بیشتری پیرامون دو کوئری فوق ارائه شود. عملیات انجام شده در اولین کوئری بسیار واضح است. یک دستورINSERT (درج) وجود دارد که در آن نام، آدرس، شهر و کد پستی یک رکورد Company با مقادیر دریافتی (VALUES) درج میشود. در کوئری دوم، شناسه آخرین رکوردی که درج شده است را یافته و آن را باز میگرداند. از طریق کوئری دوم است که میتوان شناسه شی Company جدید ایجاد شده در پایگاه داده را به دست آورد. در داخل متد Find() شناسه یا CompanyId ارجاع داده شد؛ در متد Add() باید نام، آدرس، شهر، استان و کدپستی ارجاع داده شود. کدهای مربوط به متد Add در ادامه آمده است:
1public Company Add(Company company)
2{
3 var sql = "INSERT INTO Companies (Name, Address, City, State, PostalCode) VALUES(@Name, @Address, @City, @State, @PostalCode);"
4 +"SELECT CAST(SCOPE_IDENTITY() as int);";
5 var id = db.Query<int>(sql, new
6 {
7 @Name = company.Name,
8 @Address = company.Address,
9 @City = company.City,
10 @State = company.State,
11 @PostalCode = company.PostalCode
12 }).Single();
13 company.CompanyId = id;
14 return company;
15}
همانطور که در کدهای بالا ملاحظه میشود، باز هم از متد Query بسته Dapper استفاده شده است. نوع بازگشتی در اینجا عدد صحیح است. زیرا در کوئری دوم، تابع SCOPE_IDENTITY() به وسیله تابع CAST به نوع عدد صحیح تبدیل شده است. متد Add کار افزودن پارامترهای یک رکورد Company در پایگاهدادهها را انجام میدهد و مقداری که باز میگرداند شناسه جدیدی خواهد بود که برای این رکورد ایجاد شده است.
پس از تعیین نوع بازگشتی هم نوبت به تعریف پارامترهای مربوطه میرسد. با توجه به اینکه نام خصیصهها (Property) با نام پارامترها یکسان است، میتوان نام پارامترها را در کدهای بالا حذف کرد. سپس، باید شناسه دریافت شده برای رکورد جدید نیز به فیلد شناسه اضافه شود. مقدار بازگشتی متد Query یک لیست IEnumerable است. بنابراین برای جلوگیری از بروز خطا، باید از متد single() استفاده شود. در پایان هم باید شی Company بازگردانده شود. به این ترتیب، متد Add() نیز در این بخش از آموزش Dapper پیادهسازی شد.
روش سادهتری برای ارجاع پارامترها در متد Add وجود دارد. به جای ایجاد یک شی جدید و تعریف پارامترها، میتوان شی Company را مستقیماً ارجاع داد. با توجه به اینکه نام فیلدها یکسان هستند، Dapper هوشمندی کافی برای شناسایی آنها را دارد. بنابراین، کدهای متد Add به صورت زیر درمیآیند:
1public Company Add(Company company)
2{
3 var sql = "INSERT INTO Companies (Name, Address, City, State, PostalCode) VALUES(@Name, @Address, @City, @State, @PostalCode);"
4 +"SELECT CAST(SCOPE_IDENTITY() as int);";
5 var id = db.Query<int>(sql,company).Single();
6 company.CompanyId = id;
7 return company;
8}
پیادهسازی متد Update در CompanyRepository در ادامه آموزش Dapper انجام شده است.
پیادهسازی عملیات بهروزرسانی
در این بخش از آموزش Dapper فرآیند پیادهسازی متد Update برای ویرایش هر یک از شرکتهای درج شده در شی Company انجام شده است. کدهای کوئری پایگاه داده مربوط به عملیات بهروزرسانی به صورت زیر است:
1UPDATE Companies SET Name = @Name, Address = @Address, City = @City, State =@State, PostalCode = @PostalCode WHERE CompanyId = @CompanyId
کدهای فوق به اندازه کافی واضح و به سادگی قابل درک هستند. همانند روال گذشته، در متد Update نیز باید متغیری به نام sql تعریف کرده و کوئری فوق را در داخل نقل قول قرار داد. برای انجام بهروزرسانی، نیاز به بازیابی هیچ رکوردی وجود ندارد و تنها قصد بهروزرسانی یک رکورد وجود دارد. برای این عملیات، از متد Execute استفاده میشود.
در متدهای قبلی از Query برای بازیابی عدد صحیح یا لیستی از شرکتها استفاده میشد. اما در Update، هیچ نیازی به بازیابی وجود ندارد و تنها کوئری بهروزرسانی در پایگاه داده اجرا میشود. باید شناسه رکوردی که قرار است بهروزرسانی شود را نیز ارجاع داد. همه چیز در داخل شی Company موجود است، بنابراین میتوان آن را مستقیماً در متد Execute ارجاع داد. کدهای مربوط به متد بهروزرسانی به صورت زیر است:
1public Company Update(Company company)
2{
3 var sql = "UPDATE Companies SET Name = @Name, Address = @Address, City = @City, "
4 + "State = @State, PostalCode = @PostalCode WHERE CompanyId = @CompanyId";
5db.Execute(sql,company);
6return company;
7}
از متد Execute تنها در صورتی استفاده میشود که قصد اجرای دستورات وجود داشته باشد و نیاز به بازگرداندن چیزی نباشد. از Execute در متد Remove نیز استفاده خواهد شد. در ادامه به آموزش نحوه پیادهسازی متد Remove پرداخته شده است.
پیادهسازی متد Remove
کوئری مربوط به حذف یک فیلد (شرکت) به صورت زیر است:
1DELETE FROM Companies WHERE CompanyId = @Id
برای حذف یک شرکت از پایگاه داده، تنها به شناسه آن نیاز است. بنابراین، کدهای مربوط به متد Remove برای حذف شرکت از پایگاه داده به صورت زیر پیادهسازی میشود:
1public void Remove(int id)
2{
3 var sql = "DELETE FROM Companies WHERE CompanyId = @Id";
4 db.Execute(sql,new{id});
5}
همانطور که در تصویر زیر مشخص شده است، در حال حاضر در فایل Startup از Repository شرکت با پیادهسازی Entity Framework استفاده میشود. باید این پیادهسازی را به جای CompanyRepositroyEF به CompanyRepositroy تغییر داد تا بتوان در عمل از Dapper استفاده کرد.
با اجرای اپلیکیشن و آزمایش کدها، مشخص میشود که همه چیز به درستی عمل میکند و به این ترتیب، تمام عملیات CRUD بدون Entity Framework و با استفاده از Dapper پیادهسازی شده است. به این ترتیب، آموزش Dapper در اینجا به پایان میرسد. در این پروژه تنها از دو متد Query و Execute در Dapper استفاده شد. این دو متد مهمترین متدهای Dapper به شمار میروند. برای آشنایی کامل با متدهای Dapper، بخش پایانی آموزش Dapper به معرفی کامل این متدها اختصاص داده شده است.
متدهای Dapper
در این بخش انتهایی از مطلب آموزش Dapper ، همه متدهای Dapper معرفی و مثالهایی برای هر یک از آنها ارائه شده است. اولین متد تعریف شده در این بخش، متد Execute در Dapper است.
متد Execute در Dapper
Execute یک متد افزونه (Extention Method) است که میتواند به وسیله هر شیئی از نوع IDbConnection فراخوانی شود. این متُد میتواند یک یا چندبار یک دستور را اجرا کند و سطرهای مورد نظر را بازگرداند. این متد معمولاً برای اجرای موارد زیر مورد استفاده قرار میگیرد:
- دستورالعملهای ذخیره شده
- گزاره INSERT (درج)
- گزاره UPDATE (بهروزرسانی)
- گزاره DELETE (حذف)
جدول زیر پارامترهای مختلف یک متد Execute را نمایش میدهد:
نام | توضیحات |
sql | متن دستوری که اجرا میشود. |
param | پارامترهای دستوری که اجرا میشود (پیشفرض = null). |
transaction | تراکنشی مورد استفاده قرار میگیرد (پیشفرض = null). |
commandTimeout | وقفه دستور (پیشفرض = null) |
commandType | نوع دستور (پیشفرض = null) |
مثال Execute: اجرای گزاره UPDATE
کدهای زیر مربوط به استفاده از متد Execute در Dapper برای اجرای گزاره UPDATE یا بهروزرسانی یک رکورد واحد پایگاه داده است:
1string sql = "UPDATE Categories SET Description = @Description WHERE CategoryID = @CategoryID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var affectedRows = connection.Execute(sql,new {CategoryID = 1, Description = "Soft drinks, coffees, teas, beers, mixed drinks, and ales"});
6
7 Console.WriteLine(affectedRows);
مثال Execute: اجرای چند گزاره UPDATE
در ادامه، کدهای استفاده از متد Execute برای اجرای چند گزاره UPDATE (تعداد زیاد) آمده است:
1string sql = "UPDATE Categories SET Description = @Description WHERE CategoryID = @CategoryID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var affectedRows = connection.Execute(sql,
6 new[]
7 {
8 new {CategoryID = 1, Description = "Soft drinks, coffees, teas, beers, mixed drinks, and ales"},
9 new {CategoryID = 4, Description = "Cheeses and butters etc."}
10 }
11);
12
13Console.WriteLine(affectedRows);
مثال Execute: اجرای گزاره DELETE
کدهای زیر مربوط به استفاده از متد Execute در Dapper برای اجرای گزاره DELETE یا حذف یک رکورد واحد پایگاه داده است:
1string sql = "DELETE FROM Customers WHERE CustomerID = @CustomerID";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var affectedRows = connection.Execute(sql, new {CustomerID = 1});
6
7 Console.WriteLine(affectedRows);
مثال Execute: اجرای چند گزاره DELETE
در ادامه، کدهای استفاده از متد Execute برای اجرای چند گزاره DELETE (تعداد زیاد) آمده است:
1string sql = "DELETE FROM OrderDetails WHERE OrderDetailID = @OrderDetailID";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var affectedRows = connection.Execute(sql,
6 new[]
7 {
8 new {OrderDetailID = 1},
9 new {OrderDetailID = 2},
10 new {OrderDetailID = 3}
11 }
12);
در ادامه آموزش Dapper و معرفی متدهای آن، به متد Query پرداخته شده است.
متد Query در Dapper
متد Query در Dapper یک متد افزونه است که میتوان آن را از هر شیئی با نوع IDbConnection فراخوانی کرد. این متد میتواند یک کوئری را اجرا کند و نتیجه را نگاشت دهد. نتایج را میتوان به موارد زیر نگاشت کرد:
- نوع بینام (Anonymous)
- نوع نیرومند (Strongly Typed)
- نگاشت چندگانه (یک به یک)
- نگاشت چندگانه (یک به چند)
- چند نوعی
در جدول زیر پارامترهای مختلف یک متد Query فهرست شده است:
نام | توضیحات |
sql | متن دستوری که اجرا میشود. |
param | پارامترهای دستوری که اجرا میشود (پیشفرض = null). |
transaction | تراکنشی مورد استفاده قرار میگیرد (پیشفرض = null). |
buffered | در صورت True بودن این پارامتر نتیجه کوئری خوانده میشود (پیشفرض = true). |
commandTimeout | وقفه دستور (پیشفرض = null) |
commandType | نوع دستور (پیشفرض = null) |
مثال Query: کوئری نوع بینام
میتوان با استفاده از متد Query در Dapper کوئری خام SQL را اجرا و نتیجه آن را به یک لیست پویا نگاشت کرد. کدهای مربوط به این عملیات در ادامه آمده است:
1string sql = "SELECT TOP 10 * FROM OrderDetails";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.Query(sql).FirstOrDefault();
6
7 FiddleHelper.WriteTable(orderDetail);
8}
مثال Query: کوئری نوع داده نیرومند
کوئری خام SQL را میتوان با استفاده از متد Query در Dapper اجرا کرد و نتیجه را به یک لیست نوع نیرومند (Strongly Typed) نگاشت کرد. کدهای مربوطه در ادامه آمده است:
1string sql = "SELECT TOP 10 * FROM OrderDetails";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetails = connection.Query<OrderDetail>(sql).ToList();
6
7 Console.WriteLine(orderDetails.Count);
8
9 FiddleHelper.WriteTable(orderDetails);
متد QueryFirst در Dapper
متد QueryFirst نیز همانند دو متُد قبلی یک متد افزونه Dapper است که میتواند از هر شیئی با نوع IDbConnection فراخوانی شود. این متد میتواند یک کوئری پایگاه داده را اجرا و اولین نتیجه را نگاشت دهد. نتیجه میتواند به نوع داده بینام و نوع نیرومند نگاشت داده شود. پارامترهای متد QueryFirst درست مشابه پارامترهای متد Execute است.
مثال QueryFirst: کوئری نوع داده بینام
در این مثال، یک کوئری با استفاده از متد QueryFirst در بسته Dapper اجرا شده و اولین نتیجه به یک لیست پویا نگاشت شده است. کدهای مربوط به این مثال در ادامه آمده است:
1string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.QueryFirst(sql, new {OrderDetailID = 1});
6
7 FiddleHelper.WriteTable(orderDetail);
مثال QueryFirst: کوئری نوع داده نیرومند
در کدهای زیر نیز یک کوئری اجرا و اولین نتیجه در یک لیست با نوع نیرومند نگاشت شده است:
1string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.QueryFirst<OrderDetail>(sql, new {OrderDetailID = 1});
6
7 FiddleHelper.WriteTable(orderDetail);
در ادامه بخش معرفی متدهای Dapper در مطلب آموزش Dapper به بررسی متد QueryFirstOrDefault پرداخته شده است.
متد QueryFirstOrDefault در Dapper
متد QueryFirstOrDefault نیز یک متد افزونه Dapper است. این متد میتواند یک کوئری را اجرا کرده و اولین نتیجه یا یک مقدار پیشفرض را در صورت عدم وجود عنصر در دنباله (Sequence) نگاشت دهد. نتیجه میتواند به نوع داده بینام و نوع نیرومند نگاشت داده شود. پارامترهای متد QueryFirstOrDefault نیز دقیقاً مشابه پارامترهای متد QueryFirst است.
مثال QueryFirstOrDefault: کوئری نوع داده بینام
در این مثال، یک کوئری اجرا و اولین نتیجه در یک لیست پویا نگاشت شده است. همچنین، در صورتی که دنباله حاوی هیچ عنصری نباشد، نتیجه به یک مقدار پیشفرض نگاشت میشود. کدهای مربوط به این مثال در ادامه آمده است:
1string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.QueryFirstOrDefault(sql, new {OrderDetailID = 1});
6
7 FiddleHelper.WriteTable(orderDetail);
8}
مثال QueryFirstOrDefault: کوئری نوع داده نیرومند
در ادامه نیز کدهای مربوط به اجرای یک کوئری و نگاشت نتیجه به یک لیست از نوع داده نیرومند با استفاده از متد QueryFirstOrDefault آمده است:
1string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.QueryFirstOrDefault<OrderDetail>(sql, new {OrderDetailID = 1});
6
7 FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail });
متد QuerySingle در Dapper
متد QuerySingle در خصوص نوع داده شی فراخوانی کنندهاش درست مشابه سایر متدهای Dapperاست. این متد میتواند یک کوئری پایگاه داده را اجرا کرده و اولین نتیجه را نگاشت دهد. در صورتی که دقیقاً یک عنصر در دنباله وجود نداشته باشد، متد QuerySingle یک استثنا (Exception) ایجاد میکند. نتیجه متد QuerySingle میتواند به نوع داده بینام و نوع نیرومند نگاشت داده شود. پارامترهای متد QuerySingle نیز درست مثل پارامترهای متد QueryFirstOrDefault است.
مثال QuerySingle: کوئری نوع داده بینام
در این مثال یک کوئری اجرا شده و اولین نتیجه به یک لیست پویا نگاشت داده میشود. در صورتی که دقیقاً یک عنصر در دنباله وجود نداشته باشد، یک استثنا ایجاد میشود. کدهای مربوط به این مثال در ادامه آمده است:
1string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.QuerySingle(sql, new {OrderDetailID = 1});
6
7 FiddleHelper.WriteTable(orderDetail);
مثال QuerySingle: کوئری نوع داده نیرومند
در این مثال نیز همان عملیات مثال قبل با این تفاوت انجام میشود که نگاشت به یک نوع داده نیرومند صورت میگیرد. کدهای مربوطه در ادامه آمده است:
1string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.QuerySingle<OrderDetail>(sql, new {OrderDetailID = 1});
6
7 FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail });
متد QuerySingleOrDefault در Dapper
متد QuerySingleOrDefault یک متد افزونه است که میتواند از هر شیئی از نوع IDbConnection فراخوانی شود. این متد میتواند یک کوئری را اجرا کند و اولین نتیجه را نگاشت دهد. در صورتی که دنباله خالی باشد نیز نگاشت به یک مقدار پیشفرض انجام میشود. در صورتی که بیش از یک عنصر در دنباله وجود داشته باشد، متد QuerySingleOrDefault یک استثنا قائل میشود. نتیجه متد QuerySingleOrDefault میتواند به نوع داده بینام یا نوع نیرومند نگاشت داده شود. پارامترهای متد QuerySingle نیز درست مثل پارامترهای متدهای قبلی است.
مثال QuerySingleOrDefault: کوئری نوع داده بینام
یک کوئری در این مثال اجرا میشود و اولین نتیجه به یک لیست پویا نگاشت داده میشود. همانطور که بیان شد، در صورت خالی بودن دنباله نتیجه به یک مقدار پیشفرض نگاشت میشود و همچنین در صورتی که بیش از یک عنصر در دنباله وجود داشته باشد، یک استثنا لحاظ میشود.
1string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.QuerySingleOrDefault(sql, new {OrderDetailID = 1});
6
7 FiddleHelper.WriteTable(orderDetail);
مثال QuerySingleOrDefault: کوئری نوع داده نیرومند
این مثال نیز مشابه مثال قبلی است و تنها نوع داده لیستی که به آن نگاشت میشود، متفاوت است. کدهای مربوط به استفاده از متد QuerySingleOrDefault در بسته Dapper در ادامه آمده است:
1string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";
2
3using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
4{
5 var orderDetail = connection.QuerySingleOrDefault<OrderDetail>(sql, new {OrderDetailID = 1});
6
7 FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail });
متد QueryMultiple در Dapper
متد QueryMultiple میتواند چندین کوئری را در یک دستور اجرا کند و نتایج را نگاشت دهد. پارامترهای متد QueryMultiple نیز درست مثل پارامترهای متدهای قبلی است.
مثال QuerySingleOrDefault
در ادامه کدهای مربوط به یک مثال از متد QueryMultiple آمده است:
1string sql = "SELECT * FROM Invoice WHERE InvoiceID = @InvoiceID; SELECT * FROM InvoiceItem WHERE InvoiceID = @InvoiceID;";
2
3using (var connection = My.ConnectionFactory())
4{
5 connection.Open();
6
7 using (var multi = connection.QueryMultiple(sql, new {InvoiceID = 1}))
8 {
9 var invoice = multi.Read<Invoice>().First();
10 var invoiceItems = multi.Read<InvoiceItem>().ToList();
11 }
باید دقت داشت و در شرایط مختلف از متد مناسب استفاده کرد. متدهای First و Single بسیار متفاوت هستند. میتوان از جدول زیر به عنوان راهنما استفاده کرد:
نتایج | بدون مورد | یک مورد | چندین مورد |
First | استثنا | مورد | اولین مورد |
Single | استثنا | مورد | استثنا |
FirstOrDefault | پیشفرض | مورد | اولین مورد |
SingleOrDefault | پیشفرض | مورد | استثنا |
در جدول فوق مشخص شده است که هر متد در مواجهه با ورودیهای مختلف چه واکنشی نشان میدهد. به این ترتیب کلیه متدهای Dapper معرفی و مثالهایی برای هر یک از آنها ارائه شد. برای آموزش Dapper میتوان از دوره آموزش Dapper در C# نیز استفاده کرد. این دوره در سایت فرادرس موجود است و در ابتدای این مطلب معرفی شد. در آخرین بخش از مطلب آموزش Dapper به معرفی دورههای مرتبط با آموزش Dapper در سایت فرادرس پرداخته شده است.
جمعبندی
در مطلب آموزش Dapper پیرامون چیستی Dapper و مباحث مربوط به آن از جمله چیستی ORM، چیستی میکرو ORM، مزیتها و معایب میکرو ORM و مقایسه ORM با Micro ORM توضیحات لازم ارائه شد. به برخی از سوالات مهم درباره Dapper پاسخ داده شد. برخی از این پرسشها پیرامون زمان استفاده از Dapper، کاری که Dapper انجام میدهد، نحوه عملکرد Dapper مطرح شدند. همچنین برخی از مفاهیم مرتبط با Dapper تعریف شدند. سپس به شرح پیشنیازهای آموزش Dapper و معرفی دورههای آموزشی مرتبط با آن پرداخته شد.
در ادامه مطلب آموزش Dapper ابزارهای مورد نیاز برای آموزش Dapper شرح داده شد. پس از آن، آموزش نصب Dapper صورت پذیرفت. بعد از آن، آموزش Dapper بر مبنای Entity Framework به این صورت ارائه شد که ابتدا پیادهسازی یک پروژه ساده با استفاده از چارچوب Entity به طور کامل انجام و سپس با تغییر کدها، پیادهسازی و آموزش Dapper صورت گرفت. هدف از آموزش Dapper به این شیوه، درک بهتر و سادهسازی فرآیند آموزش Dapper است.
با سلام قرار دادن سورس کد کمک قابل توجهی به کامل تر شدن آموزش می کند