UpdateNonDefaults忽略布尔参数设置为false

时间:2012-12-19 02:22:06

标签: boolean ormlite-servicestack

我尝试使用UpdateNonDefaults更新SQL Server 2012 Express DB中的记录。 从SQL语句中可以看到设置为false的布尔字段。

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

提前致谢..

4 个答案:

答案 0 :(得分:0)

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

尝试:

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

或尝试:

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

看看它是否有效?

答案 1 :(得分:0)

作为一种解决方法,我改变了我的" bool"数据类型为" string"并使用bool.FalseString和bool.TrueString来设置我的值。不太好......

答案 2 :(得分:0)

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

  

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

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

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

答案 3 :(得分:0)

当您调用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时,此处 fasle ,而 value.GetType()实际上是 typeof(bool),而不是typeof(bool?),所以value.GetType()。GetDefaultValue()始终为false。 然后,该列被忽略......