实体框架 DbContext 覆盖每个模型的保存更改

本文关键字:模型 保存更改 框架 DbContext 覆盖 实体 | 更新日期: 2023-09-27 18:30:45

我有几个与DbContext相关的模型。 如何覆盖SaveChanges以根据要保存的模型执行其他操作?

例如,假设我有两个模型,DocumentParagraph 。 如何覆盖SaveChanges以便在添加Document时创建目录,并在添加Paragraph时创建文件。

这是我到目前为止所做的尝试。

public int override SaveChanges()
{
    ChangeTracker.DetectChanges();
    var context = ((IObjectContextAdapter)this).ObjectContext;
    var stateEntries = context.ObjectStateManager.GetObjectStateEntries(
        EntityState.Added
        | EntityState.Modified
        | EntityState.Deleted
    ).ToList();
    foreach (var entry in stateEntries)
    {
        if (!entry.IsRelationship)
        {
            switch (entry.State)
            {
                case EntityState.Added:
                    break;
                case EntityState.Modified:
                    break;
                case EntityState.Deleted:
                    break;
            }
        }
    }
    return base.SaveChanges();
}

实体框架 DbContext 覆盖每个模型的保存更改

该条目具有Entity属性,该属性包含已处理实体的实例,因此您可以检查实例的类型,理论上可以执行任何您想要执行的逻辑。


除了处理实体以持久化到数据库之外,不应使用 SaveChanges 执行任何其他操作 - 这会破坏关注点的分离。上下文是应用程序逻辑和数据库之间的适配器 - 仅此而已。此外,将文件系统操作与数据库操作集成的想法需要更加复杂和仔细的处理,以解决任何操作失败的情况。在当前方案中,调用 base.SaveChanges 的任何失败都将导致文件系统中的孤立目录或文件 - 您需要使用事务文件系统并在同一事务中运行但数据库和文件系统操作,或者您必须实现手动文件系统补偿。

代码的另一个问题是,您必须在Paragraph之前处理Document实例,以确保在要插入文件等之前创建目录SaveChanges SaveChanges