2015-10-13 89 views
5

我意識到更新實體時不先選擇它們是一個常見問題,許多解決方案已經在StackOverflow上,但是在閱讀完這些後我仍然遇到問題。更新在實體框架中具有所需屬性的實體

我用下面的代碼更新用戶entitiy:

using (var context = GetContext()) 
    { 
    var userEntity = new UserEntity() { ID = userUpdate.ID }; 
    context.Users.Attach(userEntity); 
    context.Entry(userEntity).CurrentValues.SetValues(userUpdate); 
    context.SaveChanges(); 
    } 

然而,這導致DbEntityValidationException被拋出,因爲我的用戶entitiy有一些必需的特性,但這些不一定更新的設置實體。

有沒有辦法解決這個問題,或者它只是一個刪除所需屬性的情況?

謝謝!

+1

爲什麼不限制a用於'UserEntity'的可變構造函數不會將其初始化爲無效狀態? –

+0

在此實例中,我沒有所需屬性的值 - 例如,用戶實體需要Email屬性,但可能只有用戶的名稱正在更新,因此userUpdate不包含任何其他內容。如果不從數據庫中選擇用戶,我無法知道那些所需屬性設置爲什麼。 選擇實體,然後更新它_does_工作,但如果不需要,它不完全適合做不必要的查詢。 –

+0

@NathanCooper需要一個無參數的構造函數,否則EF將無法創建任何實體。 – DavidG

回答

4

我在這裏找到答案:Entity Framework/MVC3: temporarily disable validation

通過暫時禁用驗證我可以繞過檢查並插入任何數量的值,而無需先檢索所需屬性:

using (var context = GetContext()) 
{ 
    var userEntity = new UserEntity() { ID = userUpdate.ID }; 
    context.Users.Attach(userEntity); 
    context.Entry(userEntity).CurrentValues.SetValues(userUpdate); 

    // Disable entity validation 
    context.Configuration.ValidateOnSaveEnabled = false; 

    context.SaveChanges(); 
} 
1

如果你只是想更新你的實體特定領域,而不必從數據庫中首先檢索整個事情:

var userEntity = new UserEntity() { ID = userUpdate.ID }; 
userEntity.SomeProperty = userUpdate.SomeProperty; 

//Tell EF to only update the SomeProperty value: 
context.Entry(userEntity).Property(x => x.SomeProperty).IsModified = true; 

context.SaveChanges(); 
+0

不幸的是,這並沒有幫助並未設定所需屬性的問題。除非我從配置中刪除所需的屬性,否則仍會拋出異常。 –