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