در این پست از وبسایت پرووید در رابطه با دیلیت کردن داده در دیتابیس با استفاده از EF Core در روش Disconnected Scenario #2 صحبت خواهیم کرد. تکنولوژی Entity Framework Core نسل بعدی Entity Framework است که توسط مایکروسافت معرفی شده است.

در قسمت قبلی از این آموزش در رابطه با دیلیت کردن داده در دیتابیس با استفاده از EF Core در روش Disconnected Scenario صحبت کردیم.

نکته ی مهمی که باید به آن دقت کنید این است که اگر رکورد متناظر با entity ای که به متدهای Remove یا RemoveRange پاس داده اید در دیتابیس وجود نداشته باشند یک exception از نوع DbUpdateConcurrencyException ایجاد خواهد شد. طبیعتاً اقدام به delete کردن یک entity که key آن در جدول متناظر با DbSet مربوطه وجود نداشته باشد عملیات معتبری نیست. این موضوع در کد زیر نشان داده شده است.

var student = new Student() {
    StudentId = 50
};

using (var context = new SchoolContext()) {

    context.Remove<Student>(student);

    context.SaveChanges();
}

در کد بالا یک student که StudentId آن با مقدار 50 تنظیم شده است در دیتابیس وجود ندارد. بنابراین یک DbUpdateConcurrencyException شبیه به متن زیر throw خواهد شد.

Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.

در چنین شرایطی یا باید این exception را به درستی handle کنید و یا اینکه قبل از اقدام به delete کردن یک entity از وجود داشتن آن در table دیتابیس اطمینان حاصل کنید.  لطفاً کد زیر را بررسی کنید.

var student = new Student() {
    StudentId = 50
};

using (var context = new SchoolContext()) 
{
    try
    {
        context.Remove<Student>(deleteStudent);
        context.SaveChanges();
    }    
    catch (DbUpdateConcurrencyException ex)
    {
        throw new Exception("Record does not exist in the database");
    }
    catch (Exception ex)
    {
        throw;
    }
}

در بسته ی آموزش ویدئویی Entity Framework در برنامه های تجاری در رابطه با چالش های اساسی در کار با Entity Framework صحبت کرده ایم که توصیه می کنیم حتماً از آن استفاده کنید.

بسته ی آموزش ویدئویی  Entity Framework 6

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی  Entity Framework 6 دیدن کنید.

delete کردن چندین entity در Entity Framework Core در disconnected scenario

به منظور delete کردن چندین entity می توانید از متدهای DbContext.RemoveRange و DbSet.RemoveRange استفاده کنید. این موضوع در کد زیر نشان داده شده است.


IList students = new List() {
new Student(){ StudentId = 1 },
new Student(){ StudentId = 2 },
new Student(){ StudentId = 3 },
new Student(){ StudentId = 4 }
};

using (var context = new SchoolContext())
{
context.RemoveRange(students);

// or
// context.Students.RemoveRange(students);

context.SaveChanges();
}

اگر آموزش های قبلی در رابطه با درج کردن entity ها در Entity Framework Core در disconnected scenario و update کردن entity ها در Entity Framework Core در disconnected scenario را مطالعه کرده باشید می دانید که عملیات insert و update برای چندین entity در یک round trip تک انجام می پذیرد. این موضوع برای عملیات delete هم صدق می کند. کد زیر دستورات SQL حاصل از دستورات سی شارپ بالا را نشان می دهد.

exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Students]
WHERE [StudentId] = @p0;
SELECT @@ROWCOUNT;


DELETE FROM [Students]
WHERE [StudentId] = @p1;
SELECT @@ROWCOUNT;

DELETE FROM [Students]
WHERE [StudentId] = @p2;
SELECT @@ROWCOUNT;


DELETE FROM [Students]
WHERE [StudentId] = @p3;
SELECT @@ROWCOUNT;

',N'@p0 int,@p1 int',@p0=1,@p1=2,@p2=3,@p3=4
go

اجرا شدن دستورات در یک round trip تک باعث افزایش performance برنامه می شود. توصیه می کنیم حتماً از بسته ی آموزش ویدئویی Entity Framework Core از وبسایت پرووید استفاده کنید.

بسته ی آموزش ویدئویی نکات طلایی Entity Framework برای برنامه های تجاری سری اول

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی نکات طلایی Entity Framework برای برنامه های تجاری دیدن کنید.

در قسمت بعدی از این آموزش در رابطه با delete کردن related data ها در Entity Framework Core در disconnected scenario صحبت خواهیم کرد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *