地图"插入;表与EF

本文关键字:表与 EF 插入 地图 quot | 更新日期: 2023-09-27 17:54:32

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


我的方法:-使用"insert only"表
-使用复合PK,由数据库生成的int键和数据库生成的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过滤,那么我该怎么做呢,或者
    如果我使用过程选项,那么我该怎么做呢?
  2. 我的假设是不完整的——我必须生成复合键,因为对于两个修订实体,它们的ID必须相等,但它们更新的日期时间必须不同。所以我不能让数据库自动生成这些,可以吗?

地图"插入;表与EF

您可以通过为Comments创建影子表或审计表来执行仅Db路由。这将使用表触发器在字段级别跟踪所有的插入、修改和删除。我四处寻找一个工具来让它变得更容易,我在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时,您都要添加一条审计记录并与之一起保存