实体框架DbContext覆盖每个模型的SaveChanges

时间:2012-04-09 22:17:42

标签: c# asp.net entity-framework

我有一些与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();
}

1 个答案:

答案 0 :(得分:2)

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


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

您的代码的另一个问题是您必须在Document之前处理Paragraph个实例,以确保在您想要插入文件等之前创建目录。只是这个逻辑不属于SaveChanges方法,不应该从SaveChanges方法调用。