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
失败将导致文件系统中的孤立目录或文件-您需要使用事务性文件系统,但在同一事务中运行数据库和文件系统操作,或者必须实现手动文件系统补偿
代码的另一个问题是,您必须在段落之前处理文档
实例,以确保在插入文件等之前创建目录。只是此逻辑不属于保存更改
方法,不应从保存更改
方法调用