Хранение NULL вместо пустых строковых столбцов - PullRequest
3 голосов
/ 25 января 2011

Сохраняя коллекцию со всеми изменениями, как я могу гарантировать, что пустые строки должны иметь значение NULL? Я использую linq, wpf, wcf.

Я не хочу повторять для каждой записи и каждого свойства записи значение null, если оно пустое.

Ответы [ 2 ]

2 голосов
/ 25 января 2011

Вы можете использовать класс IValueConverter, как показано ниже: Ниже приведен код для double, вы можете стимулировать поведение для других типов

public class DoubleNullFromStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is double || value is double?) return value;
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return null;

        var strValue = value as string;
        if (strValue == null || strValue.Trim().Length == 0)
            return null; //allow empty strings and whitespaces

        double doubleValue = 0;
        if (double.TryParse(strValue, out doubleValue))
            return doubleValue;

        return value; //which will intenionally throw an error 
    }
}

Затем привяжите это к своему элементу управления следующим образом:

<TextBox HorizontalAlignment="Left" Name="brokeragePaidText" VerticalAlignment="Top" Width="170" >
        <TextBox.Text>
            <Binding Source="{StaticResource insertTransaction}" Converter="{StaticResource DoubleNullFromStringConverter}" UpdateSourceTrigger="Explicit" Path="BrokeragePaid">
                <Binding.ValidationRules>
                    <ExceptionValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
1 голос
/ 25 января 2011

Вы можете реализовать событие [OnSerializing] в вашем WCF DataContract, чтобы проверить наличие String.Empty и изменить его на null.EG:

[DataContract]
class MyDataStructure
{
    [DataMember]
    string Foo { get; set; }

    [OnSerializing]
    void OnSerializing(StreamingContext context)
    {
        if (Foo == String.Empty)
            Foo = null;
    }
}

И если у вас много строковых свойств и вы не хотите писать код для проверки каждого, вы всегда можете использовать Reflection для циклического просмотра свойств класса.

...