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

时间:2012-03-14 01:25:22

标签: .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();
}

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

理查德

2 个答案:

答案 0 :(得分:6)

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

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

此外,您似乎正在尝试添加一个实体类型的实体并将其添加到另一个实体类型集合(SaveChanges公开的任何内容);我建议不要这样做。如果要在另一个实体集中输入项目,请执行 not 重用这些实体,但将实例复制到正确的实体类型。

答案 1 :(得分:0)

对主键使用GUID,这样就可以生成id而无需访问数据库。