جستجو برای:
سبد خرید 0
  • محصولات
  • دوره ها
  • وبلاگ
  • درباره ما
  • تماس با ما
پرووید
ورود
[suncode_otp_login_form]
گذرواژه خود را فراموش کرده اید؟
عضویت
[suncode_otp_registration_form]

A password will be sent to your email address.

اطلاعات شخصی شما برای پردازش سفارش شما استفاده می‌شود، و پشتیبانی از تجربه شما در این وبسایت، و برای اهداف دیگری که در سیاست حفظ حریم خصوصی توضیح داده شده است.

  • 09336863931
  • info@provod.ir
پرووید
  • محصولات
  • دوره ها
  • وبلاگ
  • درباره ما
  • تماس با ما
ورود | ثبت‌نام
آخرین اطلاعیه ها
لطفا برای نمایش اطلاعیه ها وارد شوید
0

وبلاگ

پرووید > وبلاگ > تکنولوژی های دسترسی به داده (Data Access Technologies) > تکنولوژی Entity Framework > استفاده صحیح از DbContext و فراخوانی متد Dispose در EF

استفاده صحیح از DbContext و فراخوانی متد Dispose در EF

تیر 4, 1397
ارسال شده توسط مرتضی گیتی
تکنولوژی Entity Framework، تکنولوژی های دسترسی به داده (Data Access Technologies)

در این آموزش از وب سایت پرووید در رابطه با کار کردن با شی DbContext و
به طور خاص مبحث Connection ها صحبت می کنیم.

در رابطه با کار کردن با شی DbContext دو روش کلی برای ساختن این شی وجود
دارد. در روش اول شما زمانی که یک شی از کلاس اصلی ‌تان ساخته می شود شی DbContext را هم می سازیدِ این کار می‌تواند
از طریق تعریف یک فیلد Private در درون کلاس و Initialize کردن آن در تابع سازنده کلاستان انجام شود. تعریف شی به
عنوان فیلد را در قسمت زیر می بینید.

 
Public Class Customer Repository
Dim db As New CustomerEntities

و در این قسمت Initialize کردن شی DbContext را در تابع سازنده کلاس
مشاهده می کنید.

 
Public Class Customer Repository
Dim db As CustomerEntities

Public Sub New()
db = New CustomerEntities
End Sub

از این روش اغلب زمانی استفاده می شود که تمامی متد های درون یک کلاس از
شی DbContext استفاده می‌کنند و این متدها به صورت مستقل از هم و در ترکیب های مختلفی از یکدیگر فراخوانی می‌شوند.
دقت کنید که اگر در این روش فراموش کنید متعد Dispose را فراخوانی کنید طبیعتاً شی DbContext در حافظه باقی خواهد
ماند.

روش دیگر استفاده از شی DbContext قرار دادن تعریف آن در یک بلاک Using
است. اغلب از این روش زمانی استفاده می شود که کدهای مربوط به Entity Framework با بقیه فرآیندهای مربوط به Entity
Framework یکپارچه شده‌اند. در استفاده از بلاک Using همیشه در پایان این بلاک به صورت خودکار متد Dispose فراخوانی
می شود. در در واقع در استفاده از این روش حتی اگر متد Dispose را بصورت Explicit فراخوانی نکنید شی DbContext در
پایان بلاک Using از حافظ خارج میشود.

نکته دیگری که قصد دارم به آن اشاره کنم این است که در تست‌های
Performance اغلب تفاوت زیادی بین کدی که به صورت Explicit متد Dispose را اجرا میکند با کدی که فراموش میکند این
کار را انجام دهد وجود ندارد. اما این قضیه یک استثنا دارد و آن هم باز کردن Explicit شی Connection درونی DbContext
است. در چنین سناریویی اگر فراموش کنید شی Connection را ببندید DbContext آن را به صورت خودکار نخواهد بست. در واقع
اگر شما اجازه دهید DbContext مسئولیت باز کردن و بستن Connection را به عهده بگیرد این کار را به صورت خودکار انجام
می‌دهد اما اگر به صورت دستی شی Connection را باز کنید باید حتما خود شما آن را ببندید.

حال ممکن است بپرسید که باز گذاشتن شی Connection چه معایبی می تواند
داشته باشد. اگر مبحث مربوط به Connection Pooling را بدانید متوجه منظورم خواهید شد. در واقع در Connection Pooling
یک حوضچه از Connection ها ساخته شده و در زمان بسته شدن یک Connection آن شی Connection به Pool برگردانده می شود.
این موضوع باعث می‌شود که کدهای قسمت های دیگر برنامه شما مجبور نباشند شی Connection جدیدی را بسازند. ساختن شی
Connection یه کار پر هزینه از لحاظ منابع سیستم است. در واقع با استفاده از روش Connection Pooling به جای ساختن شی
Connection جدید از اشیا Connection ی که در حوضچه یا Pool قرار گرفته اند استفاده می شود.

پس به عنوان نتیجه ‌گیری اگر به DbContext اجازه می‌دهید که Connection
های شما را مدیریت کند می توانید از فراخوانی متد Dispose صرفنظر کنید اما اگر خودتان به صورت دستی Connection های
درون DbContext را مدیریت کرده و آنها را باز یا بسته می کنید حتما باید در پایان کار از متد Dispose استفاده کنید.

قبلی ابزار Dapper و دسترسی شی گرا به بانک اطلاعاتی
بعدی اصل معکوس سازی کنترل (Inversion of Control) در برنامه نویسی

پست های مرتبط

آذر 20, 1397

ساخت عملی یک پروژه ASP.NET Core MVC و Entity Framework Core

مرتضی گیتی
ادامه مطلب

خرداد 27, 1397

ابزار Dapper و دسترسی شی گرا به بانک اطلاعاتی

مرتضی گیتی
ادامه مطلب

خرداد 19, 1397

تبدیل کردن DataTable ها به JSON در استفاده از سرویس ها

مرتضی گیتی
ادامه مطلب

شهریور 10, 1396

مزیت استفاده از IQueryable به عنوان نوع خروجی متد LINQ

مرتضی گیتی
ادامه مطلب

دیدگاهتان را بنویسید لغو پاسخ

تماس با ما
  • شیراز، شهرک ولیعصر، خیابان شهید اصغر ظریف، کوچه ۱۶ (۱۲ ایثار)، پلاک ۱۹۱۲، طبقه همکف.
  • 09336863931
  • info@provid.ir
2025 © تمامی حقوق برای پرووید محفوظ است.
طراحی شده توسط آیتک استودیو