UpdateNonDefaultsを使用してSQLServer2012ExpressDBのレコードを更新しようとしています。SQLステートメントからわかるように、falseに設定されたブールフィールドは無視されます。
UpdateNonDefaultsを使用してブールフィールドのDB値をfalseに設定するにはどうすればよいですか?
前もって感謝します..
UpdateNonDefaultsを使用してSQLServer2012ExpressDBのレコードを更新しようとしています。SQLステートメントからわかるように、falseに設定されたブールフィールドは無視されます。
UpdateNonDefaultsを使用してブールフィールドのDB値をfalseに設定するにはどうすればよいですか?
前もって感謝します..
コードを投稿してください。そうしないと、何が問題なのかわかりません...
試す:
[Default(typeof(bool?), null)]
public bool? Foo {get;set;}
または試してください:
[Default(typeof(int?), null)]
public int? Foo {get; set;}
それが機能するかどうかを確認しますか?
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?
null 許容ブール値を true から false に更新すると、値はfasleであり、value.GetType()は実際にはtypeof(bool)であり、 typeof(bool?)ではないため、 value.GetType().GetDefaultValue() は常に間違い。次に、この列は無視されます...