在使用Entity Framework (EF)进行更改跟踪时,有时需要在修改记录之前获取它以进行一些自定义操作。以下是一种实现方法:
首先,在模型上定义一个类似于下面的接口:
public interface IAuditableEntity
{
DateTime CreatedDate { get; set; }
string CreatedBy { get; set; }
DateTime? ModifiedDate { get; set; }
string ModifiedBy { get; set; }
}
然后,在数据库上下文类中,将实体类中的属性类型设置为这个接口:
public DbSet BlogPosts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
if (typeof(IAuditableEntity).IsAssignableFrom(entityType.ClrType))
{
modelBuilder.Entity(entityType.ClrType).Property("CreatedDate");
modelBuilder.Entity(entityType.ClrType).Property("CreatedBy");
modelBuilder.Entity(entityType.ClrType).Property("ModifiedDate");
modelBuilder.Entity(entityType.ClrType).Property("ModifiedBy");
}
}
}
最后,在修改记录之前,通过DbContext.Entry
方法获取实体的更改跟踪对象,并保存其先前值。例如,以下示例应用于修改BlogPost实体的情况:
public async Task Edit(int id, [Bind("ID,Title,Content")] BlogPost blogPost)
{
if (id != blogPost.ID)
{
return NotFound();
}
var existingBlogPost = await _context.BlogPosts.FindAsync(id);
if (existingBlogPost == null)
{
return NotFound();
}
// get changes
var modifiedEntries = _context.ChangeTracker.Entries()
.Where(x => x.Entity.CreatedDate != DateTime.MinValue
&& x.Entity.CreatedBy != null);
// update audit fields
foreach (var entry in modifiedEntries)
{
entry.Property("ModifiedDate").CurrentValue = DateTime.Now;
上一篇:ASP.NETCoreMVC动作方法从EFCore模型中读取但将null值传递给视图和其他方法。
下一篇:ASP.NETCoreMVCEF:执行查询时,FromSqlRaw报“Sequencecontainsnoelements”错误。