我实现了类似的解决方案,关于如何在通过 EF Core 保存数据时修改创建和更新日期,如此处建议的那样 Populate Created and LastModified automagically in EF Core .
void OnEntityStateChanged(object sender, EntityStateChangedEventArgs e)
{
if (e.NewState == EntityState.Modified && e.Entry.Entity is IHasCreationLastModified entity)
entity.LastModified = DateTime.Now;
}
起初我以为只有在调用 SaveChanges()
时才会触发此操作。但显然它也在 Entry()
// Get entity
var student = _dbContext.Students.Find(studentId);
// Modify student object
student.Name = "New student name";
// Called Entry(), trigger ChangeTracker.StateChanged
var entry = _dbContext.Entry(student);
// Doesn't trigger ChangeTracker.StateChanged
_dbContext.SaveChanges();
我发现调用_dbContext.Entry(student)
时会触发ChangeTracker.StateChanged
。然后,当调用 _dbContext.SaveChanges()
时,它不会再次触发。并且它还传递了上面的条件 if (e.NewState == EntityState.Modified && e.Entry.Entity is IHasCreationLastModifiedEntity)
。
我的假设为什么在调用 SaveChanges()
时不会再次触发它,因为在调用 Entity()
后没有对实体进行新的更新。
这会导致 LastModified
属性在调用 .Entry(student)
时分配,而不是在调用 .SaveChanges()
时分配.
有没有办法在上述场景中调用 SaveChanges
时仅更新一次 LastModified
属性?
最佳答案
我建议您可以重写 dbContext 中的 SaveChanges
方法。你可以引用下面我常用的代码。
public class ForumContext : DbContext
{
public ForumContext(DbContextOptions<ForumContext> options) : base(options)
{
}
//other settings
public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
foreach (var entry in ChangeTracker.Entries())
{
switch (entry.State)
{
case EntityState.Added:
((BaseEntity)entry.Entity).AddedDate = DateTime.Now;
((BaseEntity)entry.Entity).LastModified = DateTime.Now;
break;
case EntityState.Modified:
((BaseEntity)entry.Entity).LastModified = DateTime.Now;
break;
case EntityState.Deleted:
entry.State = EntityState.Modified;
entry.CurrentValues["IsDeleted"] = true;
break;
}
}
return base.SaveChanges(acceptAllChangesOnSuccess);
}
关于c# - 调用 .Entry() 时会触发 DbContext 的 ChangeTracker.StateChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55252784/