我首先使用实体框架6数据库。我所有实体的CUD操作都映射到.edmx
文件中的存储过程。我的删除不是真实的删除 - 它们实际上将IsDeleted
列从0到1设置,然后由IsDeleted = 0
过滤实体,因此EF不会在Selects中拾取它们。
除了一个问题外,一切都很好。我的实体有一个UpdateDate
/UpdateBy
列,我想通过当前用户的值和删除时的时间进行更新。因此,我在调用.SaveChanges()
之前将它们设置为原始值,而不是我设置的数据库。
值得注意的是,为了删除,我将实体从数据库中拉出(这些字段具有一些默认值),并将其标记为删除。
如何使EF将修改的值发送到删除存储过程?
编辑您想要一些代码,所以就在这里。太微不足道了,我认为它是多余的。
public List<Audit> CreateAuditData(DbContext context)
{
var entries = from e in context.ChangeTracker.Entries()
where e.State != EntityState.Unchanged
select e;
foreach (var entry in entries)
{
Audit audit = new Audit();
audit.CreateBy = audit.UserName = HttpContext.Current.User.Identity.Name;
audit.CreateDate = DateTime.Now;
IModel model = entry.Entity as IModel;
switch (entry.State)
{
...
case EntityState.Deleted:
model.UpdateBy = audit.CreateBy;
model.UpdateDate = audit.CreateDate;
...
break
}
}
当我从此方法返回时,我立即在上下文上调用SaveChanges()
。
Audit
是我在每次更改中也保存的其他一些实体。IModel
是我所有的所有实体实施的接口,其中包含UpdateDate
和UpdateBy
属性。
由于ef仅将原始值发送到删除存储过程,因此我必须使用我想发送到该过程的值来修改实体的DbEntityEntry.OriginalValues
集合。将适当的属性映射到过程参数,我能够在数据库中获取这些值。