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