4

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

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

提前致谢..

4

4 回答 4

0

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

尝试:

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

或尝试:

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

看看有没有效果?

于 2013-09-22T13:35:30.950 回答
0

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

于 2014-05-22T16:39:39.157 回答
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() 总是错误的。然后,忽略此列...

于 2015-03-24T17:10:58.067 回答
0

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

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

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

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

于 2014-11-14T00:20:52.113 回答