【发布时间】:2015-10-13 16:24:47
【问题描述】:
我意识到在不首先选择实体的情况下更新实体是一个常见问题,并且 StackOverflow 上已经有许多解决方案,但是在阅读这些之后我仍然遇到问题。
我正在使用以下代码来更新用户实体:
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 之间的初始化值不同,则每个属性都可能被标记为已更改。
标签: c# entity-framework