مشخصات مقاله
-
573
-
0.0
-
2922
-
0
-
0
آموزش حذف داده در سناریوی disconnected در Entity Framework Core
حذف داده در سناریوی disconnected در Entity Framework Core
آموزش Delete داده در سناریوی disconnected در Entity Framework Core
EF Core API دستور DELETE را برای موجودیت هایی که EntityState شان Deleted است، در Database می سازد و اجرا می کند. تفاوتی بین حذف موجودیت در سناریوی connected و disconnected در EF Core نیست. متدهای زیر برای اینکار استفاده می شود:
مثال زیر روش های مختلف حذف یک موجودیت در سناریوی 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 وجود دارد.