我正在尝试使用 UpdateNonDefaults 更新我的 SQL Server 2012 Express DB 中的记录。从 SQL 语句中可以看出,设置为 false 的布尔字段将被忽略。
如何使用 UpdateNonDefaults 将布尔字段的 DB 值设置为 false?
提前致谢..
我正在尝试使用 UpdateNonDefaults 更新我的 SQL Server 2012 Express DB 中的记录。从 SQL 语句中可以看出,设置为 false 的布尔字段将被忽略。
如何使用 UpdateNonDefaults 将布尔字段的 DB 值设置为 false?
提前致谢..
请发布您的代码,否则我们无法判断出什么问题...
尝试:
[Default(typeof(bool?), null)]
public bool? Foo {get;set;}
或尝试:
[Default(typeof(int?), null)]
public int? Foo {get; set;}
看看有没有效果?
作为一种解决方法,我已将“bool”数据类型更改为“string”,并使用 bool.FalseString 和 bool.TrueString 来设置我的值。不太好...
当您调用 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() 总是错误的。然后,忽略此列...
这不是理想的解决方案,但我使用此处提到的匿名类型来更新可为空的布尔字段并且它有效。
限制更新字段的一种方法是使用匿名类型:
db.Update<Person>(new { FirstName = "JJ" }, p => p.LastName == "Hendrix");
有谁知道为什么 UpdateNonDefaults 不会将布尔值更新为 false?