2010-03-09 58 views
0

我的sql數據庫不允許添加2個記錄相同的數字。如果我嘗試使用先前使用的號碼創建記錄或編輯記錄以使用先前使用的號碼,則不允許使用該號碼,並通過轉包號字段返回帶有星號的編輯/創建頁面。我想爲此添加規則違規,以便可以顯示適當的消息。我試着加入:以下NerdDinner教程,不允許重複

if (db.subcontracts.Count(s => s.subcontract_no == subcontract_no) > 0) 
     yield return new RuleViolation("Subcontract number already exists", "subcontract_no"); 

寫這個時,我只想到Create方法。這裏的問題是每次編輯記錄時都會發現違規,即使subcontract_no沒有更改。所以,我想我需要它來創建記錄時發現違規行爲,如果subcontract_no發生更改,則需要編輯。但是,它不能「發現自己」並且違反規則。我怎樣才能做到這一點?

回答

1

嘗試:

db.subcontracts.Count(s => (s.subcontract_no == subcontract_no) 
    && (s.id != actually_edited_or_created_contract.id)).Count 

它將與新的或現有的實體工作,即使entity.id == NULL。

+0

謝謝。這與我提出的解決方案几乎完全相同。 – RememberME 2010-03-09 20:30:41

1

首先,在您的編輯/更新頁面上,如果值無法更改,請不要將其顯示爲可編輯的值。您可能想要在操作中取回ViewModel,從數據庫中檢索相應的模型,並使用帶有排除不可變字段限制的TryUpdateModel。其次,在您的驗證代碼中,當更改類型爲更新(而不是插入)時,請忽略對重複的轉包編號的檢查。如果外包號已經有一個(非初始值)並且您試圖更改它,那麼使用一些綁定到屬性更改處理程序中的代碼來增加此屬性,該屬性會引發異常。這應該防止在插入時設置值,並允許您跳過對更新的驗證檢查。

您也可以將它與一個強制唯一性的DB約束耦合 - 非空列上的唯一索引將起作用。

+0

我確實想讓他們編輯該字段。我只是不希望他們能夠將價值改變爲其他記錄存在的價值。 我已經將它設置爲數據庫中的唯一字段。它不允許保存它,我只是想讓用戶解釋爲什麼。 我想我已經想出了一個解決方案。我只需要嘗試一下。 – RememberME 2010-03-09 20:24:01