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请发布您的代码,否则我们无法判断出什么问题...
试试:
[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 时,这里的 value 是 fasle,而 value.GetType() 实际上是typeof(bool) 而 not typeof(bool?),因此 value.GetType().GetDefaultValue() 始终为 false。 然后,忽略此列...
【讨论】:
参考:***.com/questions/29239823/…以上是关于UpdateNonDefaults 忽略设置为 false 的布尔参数的主要内容,如果未能解决你的问题,请参考以下文章
Jackson 序列化 - 忽略未设置的值,但提供明确设置为 null 的值
UIImageView 设置为 imageWithData 忽略 contentMode