2012-09-24 30 views
0

我想知道最新最好的方式去了解,如果我想使用EF代碼第一次時會聽的數據庫所做的更改事件的變化?代碼先檢測數據庫

就像如果我有一個方法Update()如果更改了數據庫是由像將用戶添加到它,將得到提升。

+0

這是你想要什麼? http://stackoverflow.com/questions/4813933/can-i-call-ac-sharp-function-by-a-sql-server-trigger – Jageen

+0

我的思維更喜歡類似的東西,以具有的ObservableCollection當它檢測到列表的更改(添加,刪除等)時會被觸發的事件,但我希望能夠先在代碼中使用它,以便在檢測到數據庫中的更改(添加,刪除)時觸發事件。 – user1265086

+2

你到底在做什麼。我的第一印象是,你正試圖用EF來解決它不應該解決的問題。 EF環境不應該長期生活,所以你試圖做的事情完全違背最佳做法。 –

回答

0
public MyContext() { 
((IObjectContextAdapter)this).ObjectContext.SavingChanges += SavingChangesHandler; 
} 

private void SavingChangesHandler(object sender, EventArgs e) { 

foreach (DbEntityEntry entry in ChangeTracker.Entries().Where(entry => entry.State == EntityState.Added || entry.State == EntityState.Modified || entry.State == EntityState.Deleted)) { 
_log.DebugFormat("{0} Entity: {1}", entry.State.ToString(), entry.Entity.ToString().Contains("DynamicProxies") ? entry.Entity.GetType().BaseType.Name : entry.Entity.ToString()); 
if (entry.State != EntityState.Deleted) { 
     var changedProperties = entry.CurrentValues.PropertyNames.Where(p => entry.Property(p).IsModified); 
    changedProperties.ToList().ForEach(p => _log.DebugFormat("{0} changed from {1} to {2}", p, entry.Property(p).OriginalValue, entry.Property(p).CurrentValue)); 
    //TODO: handle complex properties 
       } 
      } 
    }