UpdateNonDefaults无视布尔参数设置为false [英] UpdateNonDefaults is ignoring boolean parameters set to false

查看:327
本文介绍了UpdateNonDefaults无视布尔参数设置为false的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用UpdateNonDefaults我的SQL Server 2012前preSS DB更新记录。
这是设置为false布尔领域越来越忽略,因为可以从SQL语句中可以看出。

I'm trying to update a record in my SQL server 2012 Express DB using UpdateNonDefaults. Boolean fields which are set to false are getting ignored as can be seen from the SQL statement.

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

How can I set DB value to false for boolean fields using UpdateNonDefaults?

在此先感谢..

推荐答案

当你调用UpdateNonDefaults方法,它通过在SqlEx pression.cs方法ToUpdateStatement生成SQL

While you call the UpdateNonDefaults method, it generates sql via the method ToUpdateStatement in SqlExpression.cs

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?

当您更新了真正的可空的布尔值false时,这里的 FASLE value.GetType()实际上是 typeof运算(布尔),而不typeof运算(布尔?),所以value.GetType()。GetDefaultValue()始终是假的。
然后,此列被忽略......

When you update a nullable boolean value from true to false, here the value is fasle, and value.GetType() is actually typeof(bool) while not typeof(bool?), so value.GetType().GetDefaultValue() is always false. Then, this column is ignored...

这篇关于UpdateNonDefaults无视布尔参数设置为false的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆