فرض کنید میخواهید
برای یک
پروژه، امکانی را درنظر بگیرید که بتوان برای
تمامی
رکوردهای موجودیتهای (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(); return (await base.SaveChangesAsync(true, cancellationToken)); } //override because we need add created and updated date to some entities public override int SaveChanges() { AddCreatedUpdatedDate(); return 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 && ( e.State == EntityState.Added || e.State == EntityState.Modified)); foreach (var entityEntry in entries) { ((BaseEntity)entityEntry.Entity).UpdatedDate = DateTimeOffset.UtcNow; if (entityEntry.State == EntityState.Added) { ((BaseEntity)entityEntry.Entity).CreatedDate = DateTimeOffset.UtcNow; } } }
همانطور که ملاحظه مینمایید از ChangeTracker استفاده شدهاست که پیشتر
مطلب کاملی در سایت در رابطه با آن منتشر شدهاست. در حقیقت لیستی از رکوردهای موجودیتهایی را که از BaseEntity ارث بری کرده باشند و در حال اضافه شدن یا ویرایش شدن هستند، در entries قرار میدهیم و سپس بررسی میکنیم که اگر این رکورد در حال اضافه شدن برای اولین بار است، آنگاه مقدار برابری را برای CreatedDate و UpdatedDate آن درنظر میگیریم؛ اما اگر این رکورد در حال ویرایش شدن باشد، آنگاه فقط مقدار UpdatedDate را بهروزرسانی میکنیم.
حال برای اینکه موجودیتی دارای این قابلیت شود که برای هر رکورد آن، تاریخ ساخت و به روز رسانی به صورت خودکار ثبت شود، باید از کلاس پایه BaseEntity ارث بری نماید. برای مثال:
public class Student: BaseEntity
{ public int StudentID { get; set; } public string StudentName { get; set; } public DateTimeOffset? DateOfBirth { get; set; } public decimal Height { get; set; } public float Weight { get; set; }
}
دانلود نرم افزار و برنامه...
ما را در سایت دانلود نرم افزار و برنامه دنبال می کنید
برچسب : نویسنده : دانلودی dld بازدید : 143 تاريخ : سه شنبه 22 آذر 1401 ساعت: 20:06