آموزش OnDelete در EF Core

در آموزش OnDelete در EF Core قصد داریم یکی از مفاهیم مهم در طراحی پایگاه داده با استفاده از Entity Framework Core را بررسی کنیم. Delete Behavior یا همان OnDelete. هنگامی که بین دو Entity رابطه برقرار می‌کنیم، باید تعیین کنیم که هنگام حذف یکی از طرفین، چه اتفاقی برای طرف دیگر بیفتد. این رفتارها با استفاده از متد .OnDelete() در Fluent API قابل تنظیم هستند.

انواع روش‌های حذف – OnDelete در EF Core

در EF Core، پنج روش اصلی برای تعیین رفتار حذف وجود دارد: در این آموزش، تمرکز ما روی سه نوع پرکاربرد یعنی Cascade، Restrict و SetNull خواهد بود.

نوعتوضیح عملکردمثال کاربردی
Cascadeبا حذف موجودیت والد، موجودیت‌های فرزند نیز به‌صورت خودکار حذف می‌شوند.حذف سفارشات هنگام حذف مشتری
Restrictاگر موجودیت فرزند وجود داشته باشد، حذف والد مجاز نیست. خطای ReferentialIntegrityException دریافت می‌شود.جلوگیری از حذف دسته‌بندی که محصول دارد
SetNullهنگام حذف والد، کلید خارجی فرزند null می‌شود (در صورت nullable بودن FK).حذف مدیر، اما نگه‌داشتن پروژه بدون مدیر

تنظیم OnDelete با Fluent API

در این مثال، اگر یک شرکت حذف شود، کلید خارجی کارمندان آن به null تبدیل می‌شود.

modelBuilder.Entity<Company>()
    .HasMany(c => c.Employees)
    .WithOne(e => e.Company)
    .HasForeignKey(e => e.CompanyId)
    .OnDelete(DeleteBehavior.SetNull);

چرا Data Annotation برای OnDelete کافی نیست؟

بر خلاف سایر تنظیمات مانند [Required] یا [MaxLength]، رفتار حذف (OnDelete) فقط با Fluent API قابل کنترل است و از طریق Data Annotation امکان‌پذیر نیست.

بررسی Migration و نتیجه در پایگاه داده

پس از اجرای دستور Add-Migration. در فایل migration کدی مشابه زیر مشاهده می‌شود. و در دیتابیس، Foreign Key با رفتار حذف تعیین‌شده ایجاد خواهد شد.

onDelete: ReferentialAction.SetNull

مدیریت خطاهای

حذف در زمان حذف موجودیت‌ها با رفتار Restrict یا در شرایط همزمانی، باید با استفاده از try-catch خطاها مدیریت شوند.

try
{
    _context.Companies.Remove(company);
    await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
    TempData["Error"] = "خطای همزمانی رخ داده است. لطفاً دوباره تلاش کنید.";
}
catch (DbUpdateException ex)
{
    if (ex.InnerException?.Message.Contains("REFERENCE constraint") == true)
        TempData["Error"] = "امکان حذف این شرکت وجود ندارد چون به آن کارمند اختصاص داده شده است.";
    else
        TempData["Error"] = "خطایی هنگام ذخیره اطلاعات رخ داد. لطفاً دوباره تلاش کنید.";
}
catch (Exception ex)
{
    TempData["Error"] = "خطای ناشناخته‌ای رخ داده است: " + ex.Message;
}

نتیجه‌گیری

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

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی آموزش OnDelete در EF Core در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه آموزش OnDelete در EF Core در شبکه‌های اجتماعی

نظرات شما برای ما ارزشمند است

متاسفانه تاکنون پیامی برای این مطلب ثبت نشده است. شما اولین شخصی باشید که پیام می‌گذارد.

نظرات کاربران

فرم افزودن دیدگاه

با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.