2011-09-07 137 views
9

的的DbContext的SaveChanges令我有了與序號列在表中唯一索引的表。因此,例如,該表將具有以下欄目:語句執行

TABLEID,ID1,ID2,有序

唯一索引是跨列ID1,ID2,有序。

我的問題是,從數據庫中刪除記錄時,我再重新排序的序,使他們再次順序。我的刪除功能是這樣的:

public void Delete(int id) 
    { 
     var tableObject = Context.TableObject.Find(id); 
     Context.TableObject.Remove(tableObject); 
     ResequenceOrdinalsAfterDelete(tableObject); 
    } 

的問題是,當我叫Context.SaveChanges()它打破了唯一索引,因爲它似乎比他們通過以不同的順序來執行的語句。例如,發生以下情況:

  1. 重新排序的序數
  2. 刪除記錄

相反的:

  1. 刪除記錄
  2. 重新排序的序數

這是EF的正確行爲嗎?如果是這樣,是否有一種重寫這種行爲的方法來強制執行的順序?

如果我沒有解釋這個正確,請讓我知道...

回答

9

令命令完全是在EF的控制。你可以如何影響秩序的唯一方法是使用單獨的SaveChanges每個操作:

public void Delete(int id) 
{ 
    var tableObject = Context.TableObject.Find(id); 
    Context.TableObject.Remove(tableObject); 
    Context.SaveChanges(); 
    ResequenceOrdinalsAfterDelete(tableObject); 
    Context.SaveChanges(); 
} 

你也應該運行手動創建的交易代碼,以確保原子(=>TransactionScope)。

但是,最好的解決方案可能會使用存儲過程,因爲你的重新排序要拉從數據庫中所有受影響的記錄您的應用程序,改變他們的順序,並通過一個將其保存到數據庫中的一個。

Btw。這樣做與數據庫的氣味。在「序數」序列中存在差距的問題是什麼?

+0

嗨感謝您的答覆!我以前用數據庫實現了這一點,正如你所說的那樣。該代碼是可怕的,是一個痛苦,再加上這將只能從管理部分訪問,並會改變少量。對於正在重新排序的序的主要原因是管理用戶可以設置幾個表的順序,並得到挑剔或困惑時,他們看到差距......一個令人失望的是EF不提供你雖然順序執行的位。 – didiHamman