2017-03-23 78 views
0

有一個管理人員名單(實際上是一個歷史),其中當前被標記爲屬性與TillDate == nullIsIsCurrentManager = trueASP.NET實體框架刪除()+ ToList()

db.MyManagers.Remove(db.MyManagers 
    .Where(e => e.ProjectId == projectId 
       && e.MyManagerId == Id).First()); 
var newCurrentManager = db.MyManagers 
    .Where(e => e.ProjectId == projectId) 
    .OrderByDescending(i => i.FromDate) 
    .FirstOrDefault(); 
newCurrentManager.TillDate = null; 
newCurrentManager.IsCurrentManager = true; 
db.SaveChanges(); 

的問題是,Remove()方法只會標記實體deleted,但是,據我所看到的,它仍然會被添加到列表中。如何刪除1分的記錄,比建立一個沒有IT管理人員的名單,而無需使用SaveChanges() 2倍或硬編碼MyManagerList[2]

+0

@DavidG他是對的,我想念klicked。 sry – rainbowShiningUnicorn

+0

@DavidG對不起,我只是看起來像打字給我。 –

+0

@teovankot我相信這是正確的,但在這種情況下,最好先問問,以防萬一。 – DavidG

回答

1

重要的是要記住,實體框架是剛剛到您的數據存儲的接口是非常重要的,所有你通常會做的是建立查詢,查詢不實際運行,直到你兌現一個select的結果(即通過枚舉結果或調用類似ToList()Single()),或者在更新/刪除操作的情況下,當您撥打SaveChanges()時。

因此,儘管您可以執行諸如檢查實體在上下文中作爲已刪除項目進行跟蹤的操作,但通過兩次調用SaveChanges()將結果發送到數據庫可能會更好。

這樣做的第二個好處是,另一個不使用相同上下文對象的查詢(例如另一個web請求)將能夠看到該項目已被刪除,而原始查詢試圖拉取經理。

+0

關於'SaveChanges'你是對的,但是*次要好處*是值得商榷的。許多人會爭辯說,應該用明確的transstaction包裝多個'SaveChanges'。 –

+1

你是對的,這是有爭議的,我只是把它放在那裏作爲潛在的好處。它完全取決於當時的用例。在某些情況下,您可能不希望其他人看到您所做的更改,或者像您說的那樣,在交易中進行更改。 – DavidG

1

您可以查詢實體狀態從第二列表中排除。 我也用一些清潔更新了linq請求。

另外,對於null也沒有問題,你的db查詢可以返回null,並且應該這樣管理。

 db.MyManagers.Remove(db.MyManagers 
         .FirstOrDefault(e => e.ProjectId == projectId 
          && e.MyManagerId == Id)); 
     var newCurrentManager = db.MyManagers 
         .ToList() 
         .Where(e => e.ProjectId == projectId 
         && db.Entry(e).State != EntityState.Deleted)//This will query the entity traker 
         .OrderByDescending(i => i.FromDate) 
         .FirstOrDefault(); 
     newCurrentManager.TillDate = null; 
     newCurrentManager.IsCurrentManager = true; 
     db.SaveChanges(); 
+0

您不能在EF查詢中包含狀態條件,因爲它無法轉換爲SQL。 –

+0

對不起,我更新了答案,您可以繞過.ToList(),但它可能不合適。在這種情況下,DavidG的答案更有意義。 – GaelSa