在实体框架中更新具有所需属性的实体

Posted

技术标签:

【中文标题】在实体框架中更新具有所需属性的实体【英文标题】:Updating an entity with required properties in Entity Framework 【发布时间】:2015-10-13 16:24:47 【问题描述】:

我意识到在不首先选择实体的情况下更新实体是一个常见问题,并且 *** 上已经有许多解决方案,但是在阅读这些之后我仍然遇到问题。

我正在使用以下代码来更新用户实体:

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

但是这会导致DbEntityValidationException 被抛出,因为我的用户实体有一些必需的属性,但这些属性不一定在更新的实体上设置。

有什么办法可以解决这个问题,还是只是删除所需属性的情况?

谢谢!

【问题讨论】:

为什么不将UserEntity 的可用构造函数限制为不将其初始化为无效状态的构造函数? 在此实例中,我没有所需属性的值 - 例如,用户实体需要 Email 属性,但可能只有用户名正在更新,因此 userUpdate 不包含任何其他内容。如果不从数据库中选择用户,我不知道这些必需的属性设置为什么。选择实体然后更新它确实工作,但如果我不必进行不必要的查询,它并不完全理想。 @NathanCooper 需要一个无参数的构造函数,否则 EF 将无法创建任何实体。 @DavidG 我相信你可以保护它 您可以使用context.Configuration.ValidateOnSaveEnabled = false;。但是您的方法的一点是,如果 userUpdate 是实体的类型,则实体的每个属性都会被重新设置。因此,如果 userEntity 和 userUpdate 之间的初始化值不同,则每个属性都可能被标记为已更改。 【参考方案1】:

我在这里找到了答案: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();

【讨论】:

【参考方案2】:

如果您只想更新实体中的特定字段,而不必先从数据库中检索整个内容:

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();

【讨论】:

不幸的是,这无助于解决未设置所需属性的问题。除非我从配置中删除所需的属性,否则仍然会引发异常。

以上是关于在实体框架中更新具有所需属性的实体的主要内容,如果未能解决你的问题,请参考以下文章

该属性必须是有效的实体类型,并且该属性应该具有非抽象的 getter 和 setter。实体框架 [重复]

更新映射到视图的实体框架实体

使用在多个列上具有主键的实体框架更新数据库

实体框架和多线程

无法获取要更新实体框架中导航属性的关系

实体框架6不适用于Temporal表