حذف گروهی رکورد در ASP.NET Core – جلسه ۵۶

Multi Record Deleting & On Delete Action - Session56

در این جلسه به بررسی و پیاده سازی حذف گروهی رکورد در ASP.NET Core با معماری MVC و On Delete Action می‌پردازیم. پیشتر، در جلسه 48ام و جلسه 50ام به بررسی و پیاده‌سازی حذف یک رکورد از رسانه ذخیره سازی پرداخته‌ایم. حال در این جلسه به حذف گروهی رکورد ها خواهیم پرداخت.

حذف گروهی رکورد در ASP.NET Core

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

جهت ارسال شاخص رکوردها، میتوان از فرم و المان Input با نوع CheckBox استفاده نمود. ضمنا، همانگونه که قبلا اشاره کردیم، برای عملیات حذف، بهتر است فرم با متد Post ارسال گردد. در نظر داشته باشید نام Input در این روش، باید با نام مقدار ورودی Action Method کاملا یکسان باشد.

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

@model IEnumerable<Category>
@{
    ViewBag.Title = "Category List";
}
<form asp-action="delete" method="post">
<table class="table table-dark mt-3">
    <thead>
        <tr>
            <th>Select</th>
            <th>Category Name</th>
            <th>Description</th>
        </tr>
    </thead>
    <tbody>
            @foreach (var category in Model)
            {
            <tr>
                <td><input type="checkbox" name="SelectedCatDelete" value="@category.ID"/></td>
                <td>@category.CategoryName</td>
                <td>@category.Description</td>
            </tr>
            }
    </tbody>
</table>
<button type="submit" class="btn btn-danger">Delete Selected Rows</button>
</form>

سپس درون کنترلر Category میبایست اکشن متدهای Index و Delete را جهت نمایش لیست و حذف گروهی مقادیر انتخاب شده پیاده سازی نماییم. همچنین میبایست ICategoryRepository را از طریق Constructor به کنترلر تزریق نماییم.

   public class CategoryController : Controller
    {
        private readonly ICategoryRepository categoryRepository;

        public CategoryController(ICategoryRepository _categoryRepository)
        {
            categoryRepository = _categoryRepository;
        }

        public IActionResult Index()
        {
            var CatList = categoryRepository.GetAllCategories();
            return View(CatList);
        }
        [HttpPost]
        public IActionResult Delete(IEnumerable<int> SelectedCatDelete)
        {

            categoryRepository.Delete(SelectedCatDelete);
            return RedirectToAction("Index");
        }

    }

در این مرحله، می‌بایست متد مورد نظر درون Interface و Repositoryمتناظر پیاده سازی گردد.

    public interface ICategoryRepository
    {
        IEnumerable<Category> GetAllCategories();
        IEnumerable<Category> Delete(IEnumerable<int> DeleteList);
    }

پس از تعریف متد در اینترفیس، اقدام به پیاده سازی آن در ریپازیتوری میکنیم.

        public IEnumerable<Category> Delete(IEnumerable<int> DeleteList)
        {
                var DeleteCatList = webAppDBContext.Categories.Where(z => DeleteList.Contains(z.ID)).ToList();
                webAppDBContext.Categories.RemoveRange(DeleteCatList);
                webAppDBContext.SaveChanges();
                return DeleteCatList;
        }

با اضافه نمودن قطعات کد فوق، امکان حذف گروهی به وب اپلیکیشن ASP.NET Core ما اضافه میگردد.

انواع On Delete Action

در صورتی که دو یا چند موجودیت با هم در ارتباط باشند، در صورت حذف یک رکورد از موجودیت والد، امکان وجود تغییراتی در موجودیت فرزند نیز وجود دارد. پس زمانی که کلید اصلی (Primary Key) یک موجودیت، در موجودیت دیگر به عنوان کلید خارجی (Foreign Key) استفاده شده باشد، در صورت حذف رکورد در جدول اصلی (والد) میبایست رفتار پایگاه داده نسبت به رکورد فرزند، قبلا مشخص شده باشد. در واقع به رفتار پایگاه داده بر روی رکورد فرزند، On Delete Action گفته میشود. همچنین در عملیات بروزرسانی هم، پایگاه داده رفتارهای مشابهی میتواند انجام دهد.

در ادامه به بررسی چند نوع اصلی On Delete Action می‌پردازیم.

  • Cascade: در این حالت در صورت حدف رکورد والد، رکورد فرزند نیز حذف میگردد (مقدار پیشفرض).
  • No Action: در صورت حذف رکورد والد، رکورد فرزند بدون تغییر باقی می‌ماند.
  • SetNull: در صورت حذف رکورد والد، مقدار کلید خارجی در رکورد فرزند برابر با Null قرار میگیرد.
  • Restricted: در این حالت، پایگاه داده امکان حذف رکورد والد را تا زمان وجود رکورد فررند نمی‌دهد.

جهت تنظیم این رفتارها در ASP.NET Core میتوانیم از ModelBuilder در کلاس DbContext و یا کلاس Extension آن استفاده نماییم.

    public class WebAppDBContext : DbContext
    {
        public WebAppDBContext(DbContextOptions<WebAppDBContext> options) : base(options)
        {
        }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Cost> Costs { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Cost>().HasOne(c => c.Category).WithMany(c => c.Costs).OnDelete(DeleteBehavior.Restrict);
        }

    }

در صورت نیاز به جزئیات بیشتر، میتوانید ویدئو آموزشی این جلسه را تماشا نمایید. همچنین برای آگاهی از جلسات بعدی این دوره آموزشی، ما را در اینستاگرام، تلگرام، یوتیوب و آپارات دنبال کنید. ضمنا لیست کامل جلسات در این قسمت در دسترس شما میباشد و سورس کد این جلسه را میتوانید از GitHub ما دانلود نمایید.

تماشای ویدیو در یوتیوب ما

دانلود اسلایدهای آموزشی این جلسه از اینجا

برچسب ها

0 0 رای ها
امتیازدهی به مقاله
اشتراک در
اطلاع از
guest
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
0
افکار شما را دوست داریم، لطفا نظر دهید.x