همواره حذف و به روز رسانی تعداد زیادی رکورد توسط EF، بسیار غیربهینه و کند بودهاست؛ از این جهت که یکی از روشهای انجام اینکار، کوئری گرفتن از رکوردهای مدنظر جهت حذف، سپس بارگذاری آنها در حافظه و در آخر حذف یکی یکی آنها بودهاست: using var dbContext = new MyDbContext(); var objectToDelete = await dbContext.Objects.FirstAsync(o => o.Id == id); dbContext.Objects.Remove(objectToDelete); await dbContext.SaveChangesAsync(); در اینجا در ابتدا، شیءای که قرار است حذف شود، از بانک اطلاعاتی کوئری گرفته میشود تا وارد سیستم Change Tracking شود. سپس از این سیستم ردیابی اطلاعات درون حافظهای، حذف خواهد شد و در نهایت این تغییرات به بانک اطلاعاتی اعمال میشوند. بنابراین در این مثال ساده، حداقل دوبار رفت و برگشت به بانک اطلاعاتی وجود خواهد داشت. البته راه دومی نیز برای انجام اینکار وجود دارد: using var dbContext = new MyDbContext(); var objectToDelete = new MyObject { Id = id }; dbContext.Objects.Remove(objectToDelete); await dbContext.SaveChangesAsync(); در این مثال، رفت و برگشت ابتدایی، حذف شدهاست و با فرض معلوم بودن کلید اصلی رکورد مدنظر، آنرا وارد سیستم Change Tracking کرده و درنهایت آنرا حذف میکنیم. کار متد Remove در اینجا، علامتگذاری این شیء دارای Id، به صورت EntityState.Deleted است. اکنون میتوان در EF 7.0، روش سومی را نیز به این لیست اضافه کرد که فقط یکبار رفت و برگشت به بانک اطلاعاتی را سبب میشود: await dbContext.Objects.Where(x => x.Id == id).ExecuteDeleteAsync(); معرفی متدهای حذف و بهروز رسانی دستهای رکوردها در EF 7.0 EF 7.0 به همراه دو متد جدید Exe, ...ادامه مطلب
فرض کنید میخواهید برای یک پروژه، امکانی را درنظر بگیرید که بتوان برای تمامی رکوردهای موجودیتهای (Entity) آن پروژه، زمان ساخته شدن و به روزرسانی، به صورت خودکار ثبت شود.کار با تعریف یک کلاس پایه به شکل زیر شروع میشود: public class BaseEntity { public DateTimeOffset CreatedDate { get; set; } public DateTimeOffset UpdatedDate { get; set; } } سپس برای اینکه کار مقداردهی، به صورت خودکار انجام گیرد، باید متدهای SaveChanges و SaveChangesAsync به شکل زیر در ApplicationDbContext پروژه override شوند: //override because we need add created and updated date to some entities public override async Task<int> SaveChangesAsync( CancellationToken cancellationToken = default(CancellationToken)) { AddCreatedUpdatedDate(); retu (await base.SaveChangesAsync(true, cancellationToken)); } //override because we need add created and updated date to some entities public override int SaveChanges() { AddCreatedUpdatedDate(); retu base.SaveChanges(); } تابع AddCreatedUpdatedDate نیز به شکل زیر تعریف خواهد شد: /// <summary> /// Add created and updated date to any entities that /// inherit from BaseEntity class /// </summary> public void AddCreatedUpdatedDate() { var entries = ChangeTracker .Entries() .Where(e => e.Entity is BaseEntity && ( , ...ادامه مطلب