آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش حذف داده در سناریوی disconnected در Entity Framework Core

دوره های مرتبط با این مقاله

حذف داده در سناریوی disconnected در Entity Framework Core

آموزش Delete داده در سناریوی disconnected در Entity Framework Core

EF Core API دستور DELETE را برای موجودیت هایی که EntityState شان Deleted است، در Database می سازد و اجرا می کند. تفاوتی بین حذف موجودیت در سناریوی connected و disconnected در EF Core نیست. متدهای زیر برای اینکار استفاده می شود:

DbContext متدهای
DbSet متدهای
توضیح
DbContext.Remove
DbSet.Remove
موجودیت مشخص شده را با Deleted state به DbContext اصطلاحا attach می کند و شروع به track آن می کند.
DbContext.RemoveRange
DbSet.RemoveRange
دسته ای موجودیت مشخص شده را با Deleted state به DbContext اصطلاحا attach می کند و شروع به track آن ها می کند.

مثال زیر روش های مختلف حذف یک موجودیت در سناریوی disconnected را نشان می دهد:


// 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();
}

در مثال بالا موجودیت Student با مقدار صحیح StudentId با استفاده از توابعRemove() یا از RemoveRange() پس از فراخوانی متدSaveChanges()حذف می شود.

Data از Database نیز حذف می شود. مثال بالا دستور DELETE زیر را در Database فراخوانی می کند:


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

توجه: متدهای DbContext.Remove() وDbContext.RemoveRange()در EF Core معرفی شده اند.

Exception:

اگر مقدار key در موجودیت مشخص شده در متدهای Remove() یا RemoveRange() در جدول متناظر آن در Database موجود نباشد، خطا رخ خواهد داد. مثال زیر را ببینید:


var student = new Student() {
    StudentId = 50
};
using (var context = new SchoolContext()) {
    context.Remove< Student >(student);
    context.SaveChanges();
}

در مثال بالا، یک Student با StudentId = 50 در Database موجود نیست. در نتیجه خطای DbUpdateConcurrencyException اتفاق می افتد:


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 کرد یا که قبل از حذف یک موجودیت، از وجودش در Database مطمئن شویم.


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;
    }
}

حذف چند رکورد

با استفاده از متدهای DbContext.RemoveRange() یا DbSet.RemoveRange() می توان چند موجودیت را در یک ارتباط با Database حذف کرد.


IList< Student > students = new List< Student >() {
    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();
}

در مثال بالا، 4 رکورد در یک database round trip از Database حذف می شوند. در نتیجه performance افزایش می یابد.


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

حذف Data ی مرتبط

اگر یک موجودیت با موجودیت های دیگر رابطه ی یک به یک یا یک به چند دارد، حذف Dataی وابسته در زمان حذف Dataی مرجع بستگی به config ما دارد.

برای مثال موجودیت های Student و Grade با رابطه ی یک به چند را در نظر بگیرید. به ازای یک GradeId چند رکورد Student وجود دارد. اگر بخواهیم یک grade را که موجودیت وابسته Student دارد حذف کنیم، EF خطای reference integrity error خواهد داد. برای حل این مشکل، می توانید با استفاده از Fluent API یک referential constraint action options تعریف کنید. برای مثال می توانید برای یک رابطه cascade delete option تعریف کنید. به شکل زیر:


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

حال اگر موجودیت Grade را حذف کنیم، رکوردهای Student وابسته به آن نیز از Database حذف می شوند.

در EF چندین referential constraint action options مثل SetNull، ClientSetNull و Restrict وجود دارد.

  • 138
  •    80
  • تاریخ ارسال :   1398/07/25

دانلود سورس کد دانلود فیلم آموزشی دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .