2013-01-18 61 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時間改變你添加一個審計記錄要保存它。