Правильный способ создания события OnBeforeSave в Entity Framework Core - PullRequest
0 голосов
/ 16 апреля 2020

Я учусь на 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; }
}
...