دیلیت کردن داده در دیتابیس با استفاده از EF Core در روش Disconnected Scenario

دیلیت کردن داده در دیتابیس با استفاده از EF Core در روش Disconnected Scenario

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

در این آموزش از وبسایت پرووید در رابطه با delete کردن داده ها در Entity Framework Core و در disconnected scenario صحبت خواهیم کرد. در یکی دیگر از آموزش های قبلی در رابطه با درج کردن داده ها در EF Core در disconnected scenario و همچنین update کردن entity ها در Entity Framework Core و در disconnected scenario صحبت کرده بودیم. خب، بحثمان را آغاز می کنیم.

بسته ی آموزش ویدئویی شروع به کار با Entity Framework Core 2.0

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

خب همانطور که ممکن است از دیگر آموزش های وبسایت پرووید در رابطه با Entity Framework Core بدانید، EF Core API به طور خودکار برای تمامی entity هایی که EntityState آنها بر روی مقدار Deleted تنظیم شده است دستور DELETE به سمت دیتابیس ارسال می کند. در delete کردن entity ها هیچ تفاوتی بین connected scenario و disconnected scenario وجود ندارد. این کار باعث می شود که delete کردن entity ها در EF Core بسیار ساده باشد. به منظور انجام این کار می توانید از متدهای زیر که در کلاس های DbContext و DbSet تعریف شده اند استفاده کنید.

کد زیر روش های مختلف delete کردن entity ها در disconnected scenario را نشان می دهد.

// entity to be deleted
var student = new Student() {
        StudentId = 1
};

using (var context = new SchoolContext()) 
{
    context.Remove<Student>(student);
   
    // or the followings are also valid
    // context.RemoveRange(student);
    //context.Students.Remove(student);
    //context.Students.RemoveRange(student);
    //context.Attach<Student>(student).State = EntityState.Deleted;
    //context.Entry<Student>(student).State = EntityState.Deleted;
    
    context.SaveChanges();
}

در مثال بالا، یک entity از نوع student که یک StudentId معتبر نیز دارد با استفاده از متدهای Remove یا RemoveRange از دیتابیس حذف می شود. این کار در زمان صدا زدن متد SaveChanges از کلاس context انجام می پذیرد. در واقع دستور SQL صادر شده به دیتابیس در قسمت زیر نشان داده شده است.

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

به منظور درک بهتر دستورات SQL توصیه می کنیم از بسته ی آموزش ویدئویی SQL از وبسایت پرووید استفاده کنید. دقت کنید که متدهای DbContext.Remove() و DbContext.RemoveRange() در Entity Framework Core مطرح شدند و در نسخه های قبلی EF وجود نداشتند. انجام عملیات delete با استفاده از این متدها به مراتب ساده تر است. توصیه می کنیم حتماً از بسته ی آموزش ویدئویی Entity Framework Core 2 و Entity Framework Core 1 از وبسایت پرووید استفاده کنید.

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

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

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

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

using (var context = new SchoolContext()) {

    context.Remove&amp;lt;Student&amp;gt;(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&amp;lt;Student&amp;gt;(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

در انجام عملیات delete بر روی entity هایی که با هم relationship های one-to-one و یا one-to-many دارند پیکربندی های متعددی را میتوان لحاظ کرد. این پیکربندی ها یا configuration ها به منظور تنظیم کردن مکانیزم delete شدن related entity ها می باشد. در آموزش رایگان relationship ها در Entity Framework Core از وبسایت پرووید در رابطه با پیاده سازی relationship ها در EF Core صحبت کرده ایم.

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

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

بیاید بحث را با یک مثال ادامه بدهیم. فرض کنید که دو entity با نام های Student و Grade در برنامه داریم که یک relationship از نوع one-to-many بین آن ها وجود دارد. بر اساس این relationship برای یک GradeId تعداد بیشماری student وجود دارند. اگر اقدام به delete کردن grade ای کنید که برای آن student هایی تعریف شده باشد یک reference integrity error دریافت خواهید کرد. به منظور رفع این مشکل در زمان delete کردن entity هایی که related entity دارند باید با استفاده از Fluent API در Entity Framework Core و در کلاس context یک referential constraint action option تعریف کنید. برای مثال، کد زیر انجام پیکربندی مناسب برای انجام عملیات cascade delete را نشان می دهد.

modelBuilder.Entity<Student>()
    .HasOne<Grade>(s => s.Grade)
    .WithMany(g => g.Students)
    .HasForeignKey(s => s.GradeId)
    .OnDelete(DeleteBehavior.Cascade);

با استفاده از این پیکربندی با حذف یک grade تمامی student های مرتبط با آن نیز به صورت خودکار حذف می شوند. در رابطه با Fluent API و پیکربندهای آن در آموزش رایگان Fluent API صحبت کرده ایم. ضمناً توصیه می کنیم بسته ی آموزش ویدئویی Entity Framework Core 1 را که در آن به صورت مفصل در رابطه با relationship ها و دیگر مباحث صحبت کرده ایم خریداری کنید.

بسته ی آموزش ویدئویی شروع به کار با Entity Framework Core 2.0

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

علاوه بر تنظیم کردن cascade delete پیکربندی های دیگری نیز از قبیل SetNull ،ClientSetNull و Restrict وجود دارند که می توانند توسط Fluent API در کلاس context تنظیم شوند.

امیدواریم که این آموزش از وبسایت پرووید نیز مورد توجه شما دوستان عزیز قرار گرفته باشد. ضمناً، برای مشاهده ی سرفصل تمامی دروس موجود در این دوره ی آموزشی به آموزش Entity Framework Core و دسترسی به داده ها رجوع کنید.

مرتضی گیتی
بدون نظر

ارسال نظر

نظر
نام
ایمیل
وب سایت