Ваш вопрос касается работы с библиотекой 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` в пустую строку и указывать на возможные пути решения проблемы.