在实体框架中更新具有所需属性的实体
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();
【讨论】:
不幸的是,这无助于解决未设置所需属性的问题。除非我从配置中删除所需的属性,否则仍然会引发异常。以上是关于在实体框架中更新具有所需属性的实体的主要内容,如果未能解决你的问题,请参考以下文章