EntityFramework不保存null和false值

时间:2014-04-11 08:06:38

标签: entity-framework

我尝试通过附加断开连接的实体来使用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时存在类似的问题。

实体数据模型或数据库可能有问题,但无法弄清楚是什么。

2 个答案:

答案 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();
                }
            }
}