2013-06-04 52 views
3

我有類似下面的許多一對多的關係,舊的數據庫:更新審計領域的一個多到許多實體框架模型

public class Post 
    { 
     public ICollection<Tag> Tags { get; set; } 

     ... 
    } 

    public class Tag 
    { 
     public ICollection<Post> Posts { get; set; } 

     ... 
    } 

與許多一對多關係跟蹤一個'PostTagLink'表。

通常很容易使用Code First來隱含或多或少地表達多對多關係,即在添加或刪除關係時更新「PostTagLink」表,但實際上沒有「PostTagLink」實體明確定義。在標籤和帖子

審計領域可以很容易地通過的DbContext進行更新時更改保存:

public abstract class MyAuditableEntityContext : DbContext 
    { 
     public override int SaveChanges() 
     { 
      string currentUser = Thread.CurrentPrincipal.Identity.Name; 

      foreach (DbEntityEntry<IAuditableEntity> changeEntry in base.ChangeTracker.Entries<IAuditableEntity>()) 
      { 
       if (changeEntry.State == EntityState.Added) 
       { 
        changeEntry.Entity.CreatedBy = currentUser; 
        changeEntry.Entity.RevisedBy = currentUser; 
       } 
       else if (changeEntry.State == EntityState.Modified) 
       { 
        changeEntry.Entity.RevisedBy = currentUser; 
       } 
      } 

      return base.SaveChanges(); 
     } 
    } 

但如果什麼「PostTagLink」表還包括審計領域?

我可以看到它在模型中包含PostTagLink實體的唯一解決方案(帶有多對一的關係返回標籤和帖子),因此我可以訪問DbContext SaveChanges方法中的審覈字段。

但是添加這些額外的實體使得使用該模型變得尷尬。客戶和查詢必須直接使用「鏈接」實體,而不是實體框架自動處理關係更改。

問題:是否有一些Entity-Framework-ninja技術,我可以攔截多對多關係的更改並根據需要更新鏈接表審計字段,而不必明確包含「鏈接」實體在模型中?

(再次 - 這是一箇舊的數據庫,有一點我可以做些什麼來改變它,所以我想避免添加存儲過程或任何其他邏輯數據庫。)

感謝您的時間!

回答

0

病人:「醫生,當我這樣做的時候會感到痛苦,什麼是治療?」醫生:「不要那樣做。」

我要回答我自己的問題,因爲'沒有答案'。正如我在別人看到有關相關StackOverflow問題的評論中提出的建議 - 我認爲最好將模型中明確包含「鏈接」實體。

0

因此,如果我正確地理解了這一點,那麼當您將某項添加到其中一個集合並保存實體時,您需要在多對多表中設置一個CreatedBy字段。您可以使用DbContext.Database.SqlCommand執行原始的sql來更新鏈接表審計字段。 How to execute raw sql

那麼如何截取這些變化?

這些答案可能幫助:EF4 Audit changes of many to many relationshipsEntity Framework: Tracking changes to FK associations

編輯:

僅供參考這裏是original example我張貼,可能導致你相信,你不得不把SQL到模型

+0

謝謝科林。我認爲在模型中注入SQL將會比我的情況更糟糕。儘管我懷疑該方法或使用SQL直接調用存儲過程是EF5中唯一真正的選項。也許當模型中的EF6和sprocs支持可用時,在檢測到關係變化後,我可以從模型中調用sproc。 –

+0

對不起。我在模型中給了你一個使用ObjectContext的不好的例子的鏈接。你不需要把代碼放在模型中,你可以使用DBContext來完成。我會修改我的問題中的鏈接 – Colin