2015-10-13 90 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

不幸的是,这并没有帮助并未设定所需属性的问题。除非我从配置中删除所需的属性,否则仍会抛出异常。 –