Почему CSLA включает в себя пустую строку?

У меня есть класс CSLA, как показано ниже:

```cs
[Serializable]
public partial class Person : STRootBase<Person, PersonEntity, int>, IPersonLongNameAndSalutation, IPersonPackageLoader, IPackagePrincipal
{
    public static PropertyInfo<string> FirstNamePropertyInfo = RegisterProperty<string>(p => p.FirstName);
    public string FirstName
    {
        get { return GetProperty(FirstNamePropertyInfo); }
        set { SetProperty(FirstNamePropertyInfo, value); }
    }
}
```

В базе данных поле FirstName позволяет значения NULL. Также у меня есть соответствующий класс view model:

```cs
public class PersonViewModel
{
    public string FirstName { get; set; }
}
```

Я использую AutoMapper для копирования значений из view model в объект CSLA. Однако, в процессе отладки оба свойства FirstName в объектах имеют значение NULL. Но после выполнения AutoMapper в объекте CSLA появляется пустая строка, и свойство IsDirty становится истинным. Почему это происходит? Я не совсем понимаю, как работает CSLA, поскольку это старая технология, и мне не удалось найти четкой информации об этом.
  • 5 сентября 2024 г. 18:03
Ответы на вопрос 1
Ваш вопрос касается работы с библиотекой CSLA (Component-based Scalable Logical Architecture), ее обработкой свойств и особенностями, связанными с присваиванием значений, особенно в контексте работы с пустыми строками и свойствами, допускающими значения `NULL`.

### Причина появления пустой строки

Когда вы используете AutoMapper для копирования значений из `PersonViewModel` в объект CSLA, опции конфигурации AutoMapper могут привести к тому, что значение `NULL` в `FirstName` из `PersonViewModel` конвертируется в пустую строку в объекте CSLA. Это может происходить по следующим причинам:

1. **Настройки AutoMapper:** Проверьте настройки вашей конфигурации AutoMapper. Возможно, у вас есть правила, которые определяют, как обрабатываются `NULL` значения. Если настройки не обрабатывают `NULL` значением корректно, это может привести к тому, что `NULL` преобразуется в пустую строку.

2. **Код присваивания:** Если в каком-то коде проверяется, что значение не `NULL`, и вместо этого устанавливается пустая строка, это также может приводить к аналогичному поведению.

3. **Поведение свойств в CSLA:** В CSLA, если вы вызываете `SetProperty` с `NULL`, а ваше свойство допускает `NULL`, то оно должно быть установлено в `NULL`. Однако, если AutoMapper передает пустую строку, то такое значение будет сохранено, и состояние «грязного» объекта (IsDirty) будет установлено в `true`, так как значение изменилось от исходного (предположительно, тоже `NULL`, если при инициализации значение не было установлено).

### Как это исправить

1. **Проверка конфигурации AutoMapper**: Убедитесь, что ваша конфигурация AutoMapper не создает пустые строки при присвоении `NULL`. Вы можете настроить AutoMapper таким образом, чтобы он не присваивал пустые строки:

   ```csharp
   CreateMap<PersonViewModel, Person>()
       .ForMember(dest => dest.FirstName, opt => opt.NullSubstitute(null));
   ```

2. **Проверка на уровне бизнес-логики**: Вы можете добавить дополнительные проверки и логику в классе `Person`, чтобы обрабатывать случаи, когда `FirstName` присваивается пустая строка, например:

   ```cs
   set 
   { 
       SetProperty(FirstNamePropertyInfo, string.IsNullOrEmpty(value) ? null : value); 
   }
   ```

3. **Документация и поддержка CSLA**: Поскольку CSLA может быть труден для понимания, учитывая её возраст, полезно обратиться к документации, которая есть на официальном сайте, а также искать примеры и обсуждения на форумах, такие как Stack Overflow, для получения дополнительных разъяснений и примеров.

Это основные аспекты, которые могут объяснить ваше наблюдение о преобразовании `NULL` в пустую строку и указывать на возможные пути решения проблемы.
Похожие вопросы