【问题标题】:UpdateNonDefaults is ignoring boolean parameters set to falseUpdateNonDefaults 忽略设置为 false 的布尔参数
【发布时间】:2012-12-06 08:22:49
【问题描述】:

我正在尝试使用 UpdateNonDefaults 更新我的 SQL Server 2012 Express DB 中的记录。 从 SQL 语句可以看出,设置为 false 的布尔字段将被忽略。

如何使用 UpdateNonDefaults 将布尔字段的 DB 值设置为 false?

提前谢谢..

【问题讨论】:

  • 我也有同样的问题。有什么解决办法吗?
  • 实际上,请注意,当您尝试仅更新布尔属性时,此行为确实会创建无效的 SQL 语句。它将创建一个类似的 sql: UPDATE SET WHERE 这是无效的,因为 set-clause 是空的。

标签: boolean ormlite-servicestack


【解决方案1】:

请发布您的代码,否则我们无法判断出什么问题...

试试:

[Default(typeof(bool?), null)] 
public bool? Foo {get;set;} 

或者试试:

[Default(typeof(int?), null)] 
public int? Foo {get; set;} 

看看有没有效果?

【讨论】:

  • 要重现问题只需添加一个布尔值?属性到您的模型并在该对象上尝试 UpdateNonDefault 并设置布尔值?属性为假。如果查看生成的 SQL UPDATE 语句,您会发现 SET 子句不包含 bool?属性设置。但是,如果您尝试设置相同的布尔值?使用 UpdateNonDefaults 将属性设置为 true 即可。
【解决方案2】:

作为一种变通方法,我已将“bool”数据类型更改为“string”,并使用 bool.FalseString 和 bool.TrueString 来设置我的值。不好...

【讨论】:

    【解决方案3】:

    这不是理想的解决方案,但我使用了 here 中提到的匿名类型来更新可以为空的布尔字段并且它有效。

    限制更新字段的一种方法是使用匿名 类型:

    db.Update<Person>(new { FirstName = "JJ" }, p => p.LastName == "Hendrix");
    

    有谁知道为什么 UpdateNonDefaults 不将布尔值更新为 false?

    【讨论】:

      【解决方案4】:

      当你调用UpdateNonDefaults方法时,它通过SqlExpression.cs中的ToUpdateStatement方法生成sql

      public virtual string ToUpdateStatement(T item, bool excludeDefaults = false)
      {
          var setFields = new StringBuilder();
      
          foreach (var fieldDef in modelDef.FieldDefinitions)
          {
              if (fieldDef.ShouldSkipUpdate()) continue;
              if (fieldDef.IsRowVersion) continue;
              if (updateFields.Count > 0 && !updateFields.Contains(fieldDef.Name)) continue; // added
      
              var value = fieldDef.GetValue(item);
              if (excludeDefaults && (value == null || value.Equals(value.GetType().GetDefaultValue()))) continue; //GetDefaultValue?
      
              fieldDef.GetQuotedValue(item, DialectProvider);
      
              if (setFields.Length > 0)
                  setFields.Append(", ");
      
              setFields
                  .Append(DialectProvider.GetQuotedColumnName(fieldDef.FieldName))
                  .Append("=")
                  .Append(DialectProvider.GetQuotedValue(value, fieldDef.FieldType));
          }
      
          return string.Format("UPDATE {0} SET {1} {2}",
              DialectProvider.GetQuotedTableName(modelDef), setFields, WhereExpression);
      }
      

      请注意以下行:

      if (excludeDefaults && (value == null || value.Equals(value.GetType().GetDefaultValue()))) continue; //GetDefaultValue?
      

      当您将一个可为空的布尔值从 true 更新为 false 时,这里的 valuefasle,而 value.GetType() 实际上是typeof(bool)not typeof(bool?),因此 value.GetType().GetDefaultValue() 始终为 false。 然后,忽略此列...

      【讨论】:

      猜你喜欢
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      相关资源
      最近更新 更多