c# - 调用 .Entry() 时会触发 DbContext 的 ChangeTracker.StateChanged

标签 c# asp.net-core entity-framework-core ef-core-2.1

我实现了类似的解决方案,关于如何在通过 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/

相关文章:

c# - MVC5 Account Controller 空引用异常

c# - CA2000 错误,语句为 'using'。如何使这个有效?

c# - 在 .NET 的 Reactive Extensions 中使用 Observable.FromEventPattern 时如何避免任何阻塞?

asp.net-core - Microsoft.Extensions.Identity.Stores 和 Microsoft.Extensions.Identity.Core 和 Microsoft.AspNetCore.Identity 之间有什么区别?

c# - 如何指示 Controller 中的方法不是操作方法?

c# - EF Core 1.1 迁移 - 当前的 CSharpHelper 无法构建类型文字

c# - 如何在 Acumatica 中使用 AllowEdit

c# - 使用服务结构的 MVC COre 依赖注入(inject)在启动之后和 Controller 之前获取服务

c# - 2 外键作为主键使用 EF Core 2.0 Code First

c# - Entity Framework Core 和包括子集合