实体框架 DbContext 覆盖每个模型的保存更改
本文关键字:模型 保存更改 框架 DbContext 覆盖 实体 | 更新日期: 2023-09-27 18:30:45
我有几个与DbContext
相关的模型。 如何覆盖SaveChanges
以根据要保存的模型执行其他操作?
例如,假设我有两个模型,Document
和 Paragraph
。 如何覆盖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();
}
该条目具有Entity
属性,该属性包含已处理实体的实例,因此您可以检查实例的类型,理论上可以执行任何您想要执行的逻辑。
除了处理实体以持久化到数据库之外,不应使用 SaveChanges
执行任何其他操作 - 这会破坏关注点的分离。上下文是应用程序逻辑和数据库之间的适配器 - 仅此而已。此外,将文件系统操作与数据库操作集成的想法需要更加复杂和仔细的处理,以解决任何操作失败的情况。在当前方案中,调用 base.SaveChanges
的任何失败都将导致文件系统中的孤立目录或文件 - 您需要使用事务文件系统并在同一事务中运行但数据库和文件系统操作,或者您必须实现手动文件系统补偿。
代码的另一个问题是,您必须在Paragraph
之前处理Document
实例,以确保在要插入文件等之前创建目录SaveChanges
SaveChanges
。