我目前正在开发基于EF的数据历史存储库,因为我不想使用对INSERT,DELETE等执行的触发器,并使用EF6捕获代码中的所有CRUD操作。但是,当记录删除,并且我使用entry.OriginalValues集合及其PropertyNames时,应用程序会抛出异常。 {" CurrentValues不能用于处于已删除状态的实体。"}
在状态 MODIFIED 和状态 ADD 上使用entry.OriginalValues可以正常工作。删除时如何使用OriginalValues?
注意:希望上面/下面对手头的问题有意义并且谢谢。
这是我的案例陈述中的一个片段:
switch( entry.State )
{
case EntityState.Deleted:
entry.OriginalValues
.PropertyNames
.Where( p => !ignore.Contains( p ) )
//"ignore" is a list of fields not to worry about.
.ToList()
.ForEach( p =>
HistoryList.Add( new History
{
Field1 = Value1,
Field2 = Value2,
...
}
)
};
break;
答案 0 :(得分:0)
我认为您的示例缺少一段代码...您在删除逻辑中使用“CurrentValues”的部分会引发异常。
免责声明:我是GitHub上的项目EF +(EntityFramework Plus)的所有者
您可以使用 EF +审核来制作自己的解决方案,以便轻松跟踪更改,排除/包含实体或属性,并自动保存数据库中的审核条目。
如果您不想使用该库,则可以使用所有源代码来回答几乎所有关于审核的问题。
// using Z.EntityFramework.Plus; // Don't forget to include this.
var ctx = new EntityContext();
// ... ctx changes ...
var audit = new Audit();
audit.CreatedBy = "ZZZ Projects"; // Optional
ctx.SaveChanges(audit);
// Access to all auditing information
var entries = audit.Entries;
foreach(var entry in entries)
{
foreach(var property in entry.Properties)
{
}
}
项目:http://entityframework-plus.net/
文档:Entity Framework Audit Trail Context and Track Change
修改:回答评论问题
是的,您的代码可以使用。
这正是SaveChangesAsync重载所做的事情:
public static async Task<int> SaveChangesAsync(this DbContext context, Audit audit, CancellationToken cancellationToken)
{
audit.PreSaveChanges(context);
var rowAffecteds = await context.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
audit.PostSaveChanges();
if (audit.CurrentOrDefaultConfiguration.AutoSavePreAction != null)
{
audit.CurrentOrDefaultConfiguration.AutoSavePreAction(context, audit);
await context.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
}
return rowAffecteds;
}
编辑:回答子问题
嗨Jonathan,什么是PreSaveChanges和PostSaveChanges
此方法将在保存发生之前获得所有可能的值。例如,删除了值。
这个方法是m
此方法基本上获得了一些在保存更改之前无法采取的值。例如,插入数据库中的标识值。