Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架DbContext覆盖每个模型的保存更改_C#_Asp.net_Entity Framework - Fatal编程技术网

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

C# 实体框架DbContext覆盖每个模型的保存更改,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我有两个与DbContext关联的模型。如何覆盖SaveChanges以根据保存的模型执行不同的操作 例如,假设我有两个模型,文档和段落。如何覆盖SaveChanges,以便在添加文档时创建目录,在添加段落时创建文件 到目前为止,我一直在尝试这样做 public int override SaveChanges() { ChangeTracker.DetectChanges(); var context = ((IObjectContextAdapter)this).Objec

我有两个与
DbContext
关联的模型。如何覆盖
SaveChanges
以根据保存的模型执行不同的操作

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

到目前为止,我一直在尝试这样做

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();
}

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


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

代码的另一个问题是,您必须在
段落之前处理
文档
实例,以确保在插入文件等之前创建目录。只是此逻辑不属于
保存更改
方法,不应从
保存更改
方法调用