2013-02-08 74 views
0

我在執行檢查時遇到問題,該問題會阻止開發人員在初始創建後手動或以編程方式更新代碼中的主鍵。實體框架OnChanging保護主鍵

partial class User 
{ 
    public User() 
    { 
     this.UserId = sGuid.NewSGuid(sGuidType.SequentialAtEnd); 
    } 

    partial void OnUserIdChanging(Guid value) 
    { 
     //throw if its an edit... 
     throw new DbEntityValidationException("Cannot mutate primary key"); 
    } 

} 

如果我編輯/更新一個對象,但它實際上不會讓我首先創建一個新的實體也能正常工作。有沒有什麼辦法可以在這一點上查看它是一個新的實體還是現有的實體?

由於提前, 皮特

UPDATE:

典型的我總是找不到答案我張貼後-_-!謝謝你的回答,我會將你的一個人標記爲正確的答案,因爲他們是有效的選擇。如果您使用EF設計,在設計師只需選擇屬性,並設置相應的訪問修飾符在屬性網格

public class MyEntity 
{ 
    public int Id { get; private set; } 
} 

if (this.EntityState != System.Data.EntityState.Detached) 
{ 
    throw new DbEntityValidationException("Cannot mutate primary key"); 
} 
+0

那麼你可以用鍵查詢數據庫,如果它有一個編輯,如果沒有,它的一個新對象......或者我錯了什麼? – 2013-02-08 14:33:41

+0

爲什麼不只是讓你的UserId setter是私人的? – 2013-02-08 14:36:36

+0

我確實想到了這一點(只是將其設置爲私有),這是有效的。但是它不會阻止它們生成可以更新它的類方法。但是,我想這可能無法阻止他們完全取消支票。 在onChanging事件你只是得到新的價值,如果它被手動設置,你可能會碰到錯誤的記錄等 我想避免設置它爲私人的原因是因爲我已經使用自動代碼生成和它被破壞每次我更新模型>< – 2013-02-08 14:45:18

回答

1

這個問題通常是通過使主鍵制定者privateprotected解決 - 你的代碼生成器將完成剩下的工作。

+0

嗨,看到我上面的評論,我想我想在onChanging事件,以消除任何人更新類內部方法和做一些愚蠢的可能性。但如果沒有辦法,我想我沒有選擇:( – 2013-02-08 14:52:18

+0

@PeterLea你應該更多地關注警告開發者他們做錯了什麼(如果他們不得不修改內部方法的事實isn沒有什麼是足夠的了,除了試圖完全消除愚蠢之外,我向你保證,後者是不可能完成的任務;) – Dan 2014-09-19 18:26:30