作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Entity Framework 中实现可审核的数据存储。我的目的是保留每个记录在任何给定时间点的状态的历史记录。这要求我将所有删除语句转换为更新,并将所有更新语句转换为更新+插入。
我关注了TechEd 2014 EF6 soft delete session有关拦截器基本设置的视频,但我已经到了不知道如何继续的地步。我有查询、删除和插入的有效案例,但更新是棘手的一个。
以下是该方法的基本结构:
public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
{
if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace)
{
//other query interceptors
var updateCommand = interceptionContext.OriginalResult as DbUpdateCommandTree;
if (updateCommand != null)
{
//I modify the command to soft delete the current record
//(This is pseudo code to replace to verbose EF exp builder code)
var newClause = GetNewSoftDeleteClause(updateCommand);
interceptionContext.Result = GetUpdateCommandTree(updateCommand, newClause);
//Here is where I want to insert a new command into the tree
//and copy over the data to a new record
}
}
}
据我所知,可以在 TreeCreated
方法中修改当前的 Result
,但我找不到一种方法将新命令插入到上下文中。由于拦截器似乎只处理单行操作,我开始认为我想要做的事情在 TreeCreated
方法中是不可能的。
有没有一种方法可以使用拦截器完成我想要做的事情,而无需求助于数据库触发器?
最佳答案
在这种情况下,您可以覆盖 AppicationDbContext 中的 savechanges()
。您可以使用内置属性 ChangeTracker
找出要更新的对象,然后附加需要插入的新对象。
public override int SaveChanges()
{
List<DbEntityEntry> dbEntityEntries= ChangeTracker.Entries()
.Where(e => e.Entity is Person && e.State == EntityState.Modified)
.ToList()
foreach(var dbEntityEntrie in dbEntityEntries)
{
var person = (Person)addedCourse.Entity;
var log= new Log()
{
Name=person.Name;
}
Logs.Add(log);
}
return base.SaveChanges();
}
您可以使用继承和泛型重构此代码。
关于entity-framework - 使用 Entity Framework CommandTree 拦截器添加额外的数据库命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127462/
我正在尝试在 Entity Framework 中实现可审核的数据存储。我的目的是保留每个记录在任何给定时间点的状态的历史记录。这要求我将所有删除语句转换为更新,并将所有更新语句转换为更新+插入。 我
我是一名优秀的程序员,十分优秀!