我尝试通过附加断开连接的实体来使用EntityFramework 6更新记录。我想将一个布尔字段更新为 false ,但它不起作用。我使用了sql server profiler,在上下文中调用SaveChanges时,EF没有生成更新语句。但是,如果我将值设置为 true ,则可行。例如:
这不起作用:
private void UpdateUser()
{
var user = new User { ID = 5 };
this.Context.Users.Attach(user);
user.Locked = false;
this.Context.SaveChanges();
}
这有效:
private void UpdateUser()
{
var user = new User { ID = 5 };
this.Context.Users.Attach(user);
user.Locked = true;
this.Context.SaveChanges();
}
我可以通过将属性标记为像这样修改来修复:
this.Context.Entry(user).Property(e => e.Locked).IsModified = true;
但是,如果值 true ,请不要理解为什么它会起作用,如果值 false 则不理解。尝试将字段设置为null时存在类似的问题。
实体数据模型或数据库可能有问题,但无法弄清楚是什么。
答案 0 :(得分:3)
Boolean
的默认值为false
,因此在附加后设置为false
不会将属性标记为已更改。
您可以先加载实体,然后进行修改,然后保存更改。
var user = db.Users.Find(5);
user.Locked = false;
db.SaveChanges();
或者,您可以将包含要更新的字段的实体附加到布尔字段的不同值
var user = new User { Id = 5, Locked = true; };
db.Users.Attach(user);
user.Locked = false;
db.SaveChanges();
答案 1 :(得分:1)
False是布尔字段的默认值,因此,再次设置false将不会报告更改跟踪器属性已更改。因此,它不是插入/更新语句的一部分。 如果它是数据库第一种方法,那么您的属性应该与此类似(请参阅setter):
public global::System.Boolean Locked
{
get
{
return _Locked;
}
set
{
if (_Locked != value)
{
OnLockedChanging(value);
ReportPropertyChanging("Locked");
_Locked = StructuralObject.SetValidValue(value);
ReportPropertyChanged("Locked");
OnLockedChanged();
}
}
}