1

我想保存对我的Comment实体/表所做的所有更改的历史记录。

我的方法:
- 使用“仅插入”表
- 使用复合 PK,由 db 生成的 int 键和 db 生成的 DateTime 戳组成 -在实体上
使用AsNoTracking

但是,假设它是该实体的导航属性:

public Article { 
  public int ID { get; set; }
  public string Title { get; set; }
  public string Content { get; set; }
  public virtual Comment Comments { get; set; }
}

因此,如果我调用articleFoo.Comments它将获取所有实体,这意味着所有修订。我只想得到“最新”的。我将如何实现这一目标?

- -更新 - -

  1. 如果我使用 Linq 过滤,那么我将如何处理它,或者
    如果我使用 sprocs 选项,那么我将如何做到这一点?
  2. 我的假设不完整——我必须生成复合键,因为对于两个修订实体,它们的 ID 必须相等,但它们的更新日期时间必须不同。所以我不能让数据库自动生成这些,或者我可以吗?
4

1 回答 1

0

您可以通过为Comments. 这将使用表触发器在字段级别跟踪所有插入、修改和删除。我四处寻找一种工具来使它更容易,我在 CodeProject 上找到了一个工具-但如果你搜索更长的时间,你会找到更好的东西。

如果这不能让你的船漂浮,那么......

通过 EF,您可以在提交之前检查新的、更新的或删除的评论记录,并在提交之前添加历史信息。

例如,您可以使用ObjectContext.SavingChanges来检查并记录更改,然后将您自己的历史记录添加到上下文中。

在我的示例中,我的DbContext实例是StackOverflowEntities我在基础ObjectContext.SaveChanges事件上添加和事件处理程序的地方

    // SavingChanges event handler. 
    private void context_SavingChanges(object sender, EventArgs e) {

        ObjectContext objectContext = sender as ObjectContext;

        if (objectContext != null) {
            foreach (ObjectStateEntry entry in objectContext.ObjectStateManager
                            .GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted)
                            .Where(et => et.Entity.GetType().Equals(typeof(Comment)))) {

                Comment comment = entry.Entity as Comment;
                Comment_Audit audit = new Comment_Audit {
                    BodyText = comment.BodyText,
                    Commentor = comment.Commentor,
                    ..
                    ..
                    ChangedAt = DateTime.Now,
                    ChangeType = entry.State.ToString()

                };

                StackOverflowEntities.Set<Comment_Audit>().Add(audit);

            }
        }
    }

现在,每次Comment更改 a 时,您都会添加一条审计记录以与它一起保存。

于 2013-01-19T16:01:08.363 回答