DbContext ChangeTracker:添加的审核实体的ID

Ric*_*ard 5 .net entity-framework entity-framework-4 ef-code-first dbcontext

我有这样的事情:

public override int SaveChanges()
{
    foreach (var changeLog in this.ChangeTracker.Entries()
        .Where(p => p.State == EntityState.Added ||
               p.State == EntityState.Deleted ||
               p.State == EntityState.Modified)
        .SelectMany(entity => AuditRecords(entity)))
    {
        this.ChangeLogs.Add(changeLog);
    }

    return base.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,当添加EntityState时(直到SaveChanges之后),审计的更改日志将不包含实体的主键值.如何获取更改审核目的的主键值?

理查德

cas*_*One 6

我将对实体的引用存储在List<T>(或数组或其他此类结构)中,然后调用底层实现SaveChanges.

当调用完成时,因为您的实体是引用类型(最佳实践表明它们应该是可变的),应填充列表中这些项的主键,此时您可以将已更改实体的列表传递给您的审计层.

此外,您似乎正在尝试添加一个实体类型的实体,并将其添加到另一个实体类型集合(无论暴露的是什么ChangeLogs); 我建议不要这样做.如果要在另一个实体集中输入项目,请不要重复使用这些实体,而是将实例复制到正确的实体类型.