2016-12-15 138 views
-1

我目前正在尋找方法來正確檢查我的entitiy框架是否被添加,修改或刪除。以下是我的編碼:檢查實體框架被添加,修改或刪除

int state = 0; 

    var added = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList(); 
    var modified = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified).ToList(); 
    var deleted = this.ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted).ToList(); 

     if (added.Count > 0) 
      state = 1; 
     if (modified.Count > 0) 
      state = 2; 
     if (deleted.Count > 0) 
      state = 3; 

目前它正在工作。我只想知道是否有其他適當的方式來做到這一點。

+1

說實話,我從來沒有見過這種檢查的必要性。如果我懷疑我有未決的更改,則執行SaveChanges()並繼續。 你的問題確實讓我好奇,是什麼讓你看到需要。你能詳細說明一下嗎? 此外,我意識到你的代碼可能不是實際的代碼,而是一個簡化的版本。因此,如果一個條目發生了變化而另一個條目被刪除,會發生什麼?在你的例子中,狀態似乎被覆蓋了。我想你有一個更詳細的狀態跟蹤結構? –

+0

@Streamcap您好Streamcap。其實我在做什麼是我需要記錄我的EF中的變化,並對其進行評論。例如,如果EF添加,評論將是「創建新(某些)」,如果修改它將是「更新(某事)」。現在,只有一個條目可以一次更改。你認爲這是正確的嗎?謝謝 – Farid

+0

@Farid確實有幾種方法可以做到這一點。一種方法(儘管很粗糙)是在插入/更新/刪除時寫入日誌行的數據庫中放置觸發器。另一種是使用日誌框架,以防需要更詳細地檢測更改。我會建議看看Serilog,它是免費的而且功能強大,不需要額外的工作。 –

回答

0

爲了提高性能

  • 你可以使用Any而不是創建包含所有實體列表。
  • 你沒有確定fullowing state值之一,如果先前的發現

代碼:

int state = 0; 

if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Deleted)) 
{ 
    state = 3; 
} 
else if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Modified)) 
{ 
    state = 2; 
} 
else if (this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added)) 
{ 
    state = 1; 
} 
0

如果您使用實體框架6,你可以override SaveChanges()

public override int SaveChanges() 
{ 
    var addedEntites= ChangeTracker.Entries<IfYouWantSpecifyAnyType>() 
         .Where(p => p.State == EntityState.Added) 
         .Select(p => p.Entity); 

    var modified= ChangeTracker.Entries<IfYouWantSpecifyAnyType>() 
         .Where(p => p.State == EntityState.Modified) 
         .Select(p => p.Entity); 

    var now = DateTime.UtcNow; 

    foreach (var added in addedEntites) 
    { 
    added.CreatedAt = now; 
    added.LastModifiedAt = now; 
    } 

    foreach (var modified in modified) 
    { 
    modified.LastModifiedAt = now; 
    } 

    return base.SaveChanges(); 
} 

它會有@Matthias Burger建議的性能影響,也是我的uld建議使用一個觸發器或一些將保留在數據庫端的東西。

相關問題