2013-01-18 24 views
0

映射“仅插入”表我想保存对我的Comment实体/表进行的所有更改的历史记录。使用EF

我的方法:
- 使用"insert only" table
- 使用composite PK,做成一个数据库生成的INT键和DB-生成日期时间戳
- 在实体

但使用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它会得到所有这意味着所有修订的实体。我只想得到“最新”的一个。我将如何实现这一目标?

--- UPDATE ---

  1. 如果我使用Linq过滤然后我会如何去做,或者
    如果我用存储过程选项,然后我会怎么做呢?
  2. 我的假设是不完整的 - 我必须生成组合键,因为对于两个修订实体,它们的ID必须相等,但它们的更新日期时间必须不同。所以我不能让db自动生成这些,或者我可以吗?
+0

请考虑更改标题以匹配问题,即记录更改实体或总结如下:) –

+0

将此作为一个确切的副本关闭是不明智的。链接到的问题以及所有相关问题适用于一般数据库实践。 **我问如何在实体框架**中做到这一点,它具有细微差别和陷阱,在做直线SQL时是无关紧要的。一般数据库审计不是这里所要求的,我想知道如何在EF5中使用“仅插入”表格。 –

+1

标题是适合的......你如何做到“仅插入”实体框架版本5.审计是一个更一般的概念。有很多方法可以进行审计。我想在EF5中使用“仅插入”表格。感谢您的意见。 –

回答

0

您可以通过为Comments创建影子或审核表来执行仅限Db的路由。这将使用表格触发器跟踪所有插入,在字段级别修改和删除。我四处寻找一个工具,使其更容易,我在CodeProject here上找到了一个工具 - 但如果搜索时间更长,则可以找到更好的工具。

如果不浮动,然后你的船......

通过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时间改变你添加一个审计记录要保存它。