首页 > 解决方案 > 在 Entity Framework Core 中创建 OnBeforeSave 事件的正确方法

问题描述

我正在学习使用 Entity Framework Core,我只想让自己DbContext有一个事件。我不知道如何描述它,所以我在这里展示我的代码:

public class MyDbContext : DbContext
{
    public MyDbContext([NotNull] DbContextOptions options) : base(options)
    {
    }

    protected MyDbContext()
    {
    }

    public DbSet<Student> Students { get; set; }

    public delegate void OnBeforeSaveDelegate(IEnumerable<EntityEntry> sender);
    public event OnBeforeSaveDelegate OnBeforeSave;

    public override int SaveChanges()
    {
        ChangeTracker.DetectChanges();
        var entries = ChangeTracker.Entries();
        OnBeforeSave?.Invoke(entries);
        return base.SaveChanges();
    }
}

然后在我的句柄代码中,我可以使用类似的东西

public class MyHandle
{
    private MyDbContext dbContext = new MyDbContext();

    public MyHandle()
    {
        dbContext.OnBeforeSave += AssignDateTime;
    }

    private void AssignDateTime(IEnumerable<EntityEntry> sender)
    {
        foreach (var entry in sender)
        {
            if (entry.Entity is IDatetimeStampable stampable) //Imagine this is an interface with have ModifiedDate and CreatedDate 
            {
                if (entry.State == EntityState.Added)
                {
                    stampable.ModifiedDate = DateTime.Now;
                    stampable.CreatedDate = DateTime.Now;
                }
                else if (entry.State == EntityState.Modified)
                {
                    stampable.ModifiedDate = DateTime.Now;
                }
            }
        }           
    }
    public void AddStudent(Student input)
    {
        dbContext.Students.Add(input);
        dbContext.SaveChanges();
    }
}

但是当我调用dbContext.SaveChange()我的实体时,这些实体IDatetimeStampable仍然具有默认值DateTime(01/01/0001 00:00:00)。

有人可以指出我出了什么问题吗?

编辑:显示更多实体类和IDatetimeStampable

public interface IDatetimeStampable 
{
    DateTime CreatedDate { get; set; }
    DateTime ModifiedDate { get; set; }
}

public class Student : IDatetimeStampable 
{
    public int Id { get; set; }
    public string Name { get; set; }

    //Implements
    public DateTime CreatedDate { get; set; }
    public DateTime ModifiedDate { get; set; }
}

标签: c#.net-coreentity-framework-core

解决方案


推荐阅读