我看到兩個選項,你這樣做,但他們都意味着無論是引入對所有實體的基本類型或一個接口來覆蓋它們在一個通用功能。我更喜歡一個接口,儘管每個實體都必須一次又一次地實現它。
比方說,你創建
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但我很好奇,爲什麼你說「現在你依賴於客戶端的時鐘」取決於System.DateTime是的,但依賴於客戶端在哪裏?或者你是否僅僅意味着依賴於代碼運行的機器的時鐘。在這種情況下,肯定會的。有一個依賴注入解決方案。但那是另一個話題。 –
@soadyp是的,你是對的。代碼運行的機器的時鐘。很好指出。 「客戶端」是相當重載的詞。 –