c# - 在 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; }
}
解决方案
推荐阅读
- session - 创建多个文件夹以在 mobaXterm 上保存多个会话
- ros - 通过 FIROS 进行数据交换失败
- php - PHP ORACLE 全局临时表
- c# - Azure 持久功能“未找到”
- swift - aws appsync 离线:收到错误未提供变量 ID
- wordpress - Wordpress:woocommerce 创建不允许我的网站通过清漆缓存的 cookie
- html - 背景颜色 css 不能正确应用
- xslt - XSL 根据属性值匹配从节点获取值
- actions-on-google - How to get the Authentication Provider for actions-on-google on Node using account linking with Auth0?
- android - Recycler View,而不是创建新的View Holder,将布局添加到之前的ViewHolder