UpdateNonDefaults 忽略设置为 false 的布尔参数

Posted

技术标签:

【中文标题】UpdateNonDefaults 忽略设置为 false 的布尔参数【英文标题】:UpdateNonDefaults is ignoring boolean parameters set to 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 是空的。
【参考方案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。 然后,忽略此列...

【讨论】:

参考:***.com/questions/29239823/…

以上是关于UpdateNonDefaults 忽略设置为 false 的布尔参数的主要内容,如果未能解决你的问题,请参考以下文章

Jackson 序列化 - 忽略未设置的值,但提供明确设置为 null 的值

svn 目录设置为 不提交 忽略

为 QTextEdit 设置字体被忽略,没有明显的原因

UIImageView 设置为 imageWithData 忽略 contentMode

f:viewAction 被忽略,当 commandButton 导航到页面时

git忽略多个匹配文件