PDA

View Full Version : شبیه سازی trigger در entity framework



Mohammadvb6
یک شنبه 05 شهریور 1391, 14:39 عصر
با سلام

آیا میشه عملی که trigger ها در sql انجام میدهند رو با entity framework شبه سازی کرد .

به طور مثال اگر عمل حذف توسط entity framework انجام شود سپس یک عمل دیگر روی جداول انجام شود .

Amirpooyan
دوشنبه 06 شهریور 1391, 02:00 صبح
چرا خیلی ها به جای SQL Server می نویسن SQL؟ :عصبانی++:

در مورد جواب سوال شما، ممکن وضعیت هایی پیش بیاد که در اونها نشه از DB trigger ها استفاده کرد، مثلا شما Solution خودتون رو برای دو تا RDBMS مختلف SQL Server و MySQL بصورت انتخابی منتشر کنید، اون موقع نمیتونید از DB trigger ها استفاده کنید و خب باید این کار رو با برنامه نویسی پیاده سازی کنید.

حالا چطوری میشه این کار رو انجام داد! :متفکر: خب من یه ایده دارم که درباره اش می نویسم، اما قبلش اشاره کنم که من فقط با EF 3.5 و EF 4 تا حدی آشنا هستم و خیلی در این زمینه با تجربه نیستم و در مورد امکانات نسخه های جدیدتر EF هم چیز زیادی نمی دونم، پس شاید روشی بهتر از ایده من برای این کار باشه. اما حسن ایده من اینه که حتی در EF 3.5 هم قابل پیاده سازی کردن هست.

همونطور که احتمالا میدونید ObjectContext دارای یه Event به اسم SavingChanges هست که قبل از اجرای عملیات ذخیره سازی، فراخوانی میشه:

The SavingChanges event is raised at the start of a SaveChanges operation on an ObjectContext. This event is typically used to validate changed objects before new values are written to the database.

حالا کافی شما یک handler به این رویداد ثبت کنی، منظورم اینه: register a handler for the SavingChanges event فارسیش شاید زیاد رسا نباشه. خب فکر کنم کد زیر جزئیات رو مشخص کنه:

private void dbContext_SavingChanges(objectsender, EventArgs e)
{
foreach (dbContext.ObjectStateEntry entry in dbContext.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted))

{
if(entry.State == EntityState.Added )
{
DoSomething()
}

if(entry.State == EntityState.Modified)
{
DoSomething()
}

if(entry.State == EntityState.Deleted)
{
DoSomething()
}
}
}

این ساده ترین ایده ای بود که به ذهنم من رسید. البته میشه با T4 Template این Event رو داخل EDM هندل کرد که امکان پیاده سازی منتطق های پیچیده تر راحت تر میشه.

بد نیست به این نکته هم اشاره کنم که درسته T4 بطور توکار یا built in از VS 2010 اضافه شد، اما در VS 2008 هم میشه ازش استفاده کرد. :چشمک:

Amirpooyan
دوشنبه 06 شهریور 1391, 20:18 عصر
خب دو نکته امروز به ذهنم رسید که به این مطلب اضافه کنم:

اول اینکه یکی از Overload های متد SaveChanges در ObjectContext به صورت virtual پیاده سازی شده، یعنی:
public virtual int SaveChanges
(
SaveOptions options
)

که خب در ارث بری هم رفتارش میشه رفتارش رو عوض کرد. :لبخند:

دومین نکته اینکه برای رسیدن به این مهم در روش Code First با انعطاف بیشتر و راحت تر قابل پیاده سازی هست تا در روش Database First و Model First.