2013-02-01 92 views
0

我正在使用EF 5.0和模型第一種方法。我已經構建了一個具有基本get,insert,delete等語句的GenericRepository。如:GenericRepository實例更改屬性值

public virtual void Insert(TEntity entity) 
{ 
     dbSet.Add(entity); 
} 

我的EF實體都具有Modified和ModifiedBy屬性。現在我想在每次保存實體時更改此值。 是否有可能修改這兩個屬性(設置值),而無需一直編寫特定的實現?

謝謝

回答

2

我看到兩個選項,你這樣做,但他們都意味着無論是引入對所有實體的基本類型或一個接口來覆蓋它們在一個通用功能。我更喜歡一個接口,儘管每個實體都必須一次又一次地實現它。

比方說,你創建

interface IAuditable 
{ 
    DateTime Modified { get; set; } 
    string ModifiedBy {get; set; } // User id? 
} 

現在你可以這樣做:

public virtual void Insert(TEntity entity) 
    where TEntity : IAuditable 
{ 
    entity.Modified = DateTime.Now; 
    entity.ModifiedBy = ???? // Whatever you get the name from 
    ... 
} 

(同爲編輯)

您也可以訂閱上下文的SavingChanges事件:

// In the constructor: 
context.SavingChanges += this.context_SavingChanges; 

private void context_SavingChanges(object sender, EventArgs e) 
{ 
    foreach (var auditable in context.ObjectStateManager 
     .GetObjectStateEntries(EntityState.Added | EntityState.Modified) 
     .Select(entry => entry.Entity) 
     .OfType<IAuditable>) 
    { 
     auditable.Modified = DateTime.Now; 
     auditable.ModifiedBy = ????; 
    } 
} 

如果您有DbContext工作,你可以得到該事件由

((IObjectContextAdapter)this).ObjectContext.SavingChanges 

我想補充一點,更可靠的實時跟蹤可以(也許應該)通過數據庫觸發器來實現的。現在你依賴於客戶的時鐘。

+1

解決方案很好,我使用類似的東西。 +1但我很好奇,爲什麼你說「現在你依賴於客戶端的時鐘」取決於System.DateTime是的,但依賴於客戶端在哪裏?或者你是否僅僅意味着依賴於代碼運行的機器的時鐘。在這種情況下,肯定會的。有一個依賴注入解決方案。但那是另一個話題。 –

+0

@soadyp是的,你是對的。代碼運行的機器的時鐘。很好指出。 「客戶端」是相當重載的詞。 –

0

你可以要使用在你的倉庫中的所有方法下面的代碼做到這一點。

 public virtual void Edit(TEntity entity) 
    { 
      entity.Modified=DateTime.Now; 
      entity.ModifiedBy=User.Identity.Name; 
      //Other saving to repository code 
    } 
+0

不對不起,TEntity是通用的,並且沒有Modified或ModifiedBy,請參閱http://msdn.microsoft.com/de-de/library/vstudio/bb341748.aspx –