英文:
How to get previous state of a tracked entity in dbcontext after savechanges
问题
当我们使用DbContext时,它会跟踪附加到其中的实体发生的更改。
如果您修改属性,会向ChangeTracker.Entries添加一个具有EntityState.Modified状态的条目,当您添加或删除实体时也会发生相同的情况,它们将以EntityState.Added或EntityState.Deleted状态发送到ChangeTracker;
按状态获取条目的一种方法:
private List<EntityEntry> GetChangesByType(params EntityState[] states)
{
var entries = this.ChangeTracker.Entries();
return entries.Where(x => states.Contains(x.State)).ToList();
}
我需要记录这些条目以及它们正在发生的操作,但是在添加实体的情况下,我不会有Id,因此我需要在记录之前执行savechanges,但是当调用savechanges时,它将所有已跟踪的条目移到EntityState.Unchanged状态,这样我无法知道这些条目的先前状态。
是否有一种方法可以获取先前的状态,或者有其他解决方案可以实现这一点?
英文:
When we are working with DbContext it tracks what happens to the entities attached to it.
If you modify a property, an entry will be added to ChangeTracker.Entries with EntityState.Modified, the same happens when you add or delete entites, they will be sent to ChangeTracker with a State EntityState.Added or EntityState.Deleted;
A way to get the entries by state:
private List<EntityEntry> GetChangesByType(params EntityState[] states)
{
var entries = this.ChangeTracker.Entries();
return entries.Where(x => states.Contains(x.State)).ToList();
}
I need to log these entries with the operation that is occurring to them, but In case of adding an entity I will not have the Id, so I need to perform a savechanges before log, but when savechanges in called, it moves all tracked entries to EntityState.Unchanged, by doing this I can't know the previous state of these entries.
Is there a way to get the previous state, or another solution to do this
答案1
得分: 2
在SaveChanges
之前捕获条目并在之后进行处理 - 它们将包含已更新的标识符。例如:
public override int SaveChanges()
{
var entries = GetChangesByType(...);
var result = base.SaveChanges();
// 处理/记录这些条目,它们将包含已填充的标识符
return result;
}
英文:
Capture the entries before the SaveChanges
and process them after - they will contain the updated ids. For example:
public override int SaveChanges()
{
var entries = GetChangesByType(...);
var result = base.SaveChanges();
// process/log the entries, which will have ids filled
return result;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论