4

UpdateNonDefaultsを使用してSQLServer2012ExpressDBのレコードを更新しようとしています。SQLステートメントからわかるように、falseに設定されたブールフィールドは無視されます。

UpdateNonDefaultsを使用してブールフィールドのDB値をfalseに設定するにはどうすればよいですか?

前もって感謝します..

4

4 に答える 4

0

コードを投稿してください。そうしないと、何が問題なのかわかりません...

試す:

[Default(typeof(bool?), null)] 
public bool? Foo {get;set;} 

または試してください:

[Default(typeof(int?), null)] 
public int? Foo {get; set;} 

それが機能するかどうかを確認しますか?

于 2013-09-22T13:35:30.950 に答える
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?

null 許容ブール値を true から false に更新すると、fasleであり、value.GetType()は実際にはtypeof(bool)であり、 typeof(bool?)ではないため、 value.GetType().GetDefaultValue() は常に間違い。次に、この列は無視されます...

于 2015-03-24T17:10:58.067 に答える