问题描述
我试图用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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!