Вот функция, которую я поместил в мой подкласс DbContext
, который заменяет пустые или пробельные строки на ноль.
Я все еще не оптимизировал его, поэтому любые советы по производительности будут очень полезны.
private const string StringType = "String";
private const EntityState SavingState = EntityState.Added | EntityState.Modified;
public override int SaveChanges()
{
var objectContext = ((IObjectContextAdapter)this).ObjectContext;
var savingEntries =
objectContext.ObjectStateManager.GetObjectStateEntries(SavingState);
foreach (var entry in savingEntries)
{
var curValues = entry.CurrentValues;
var fieldMetadata = curValues.DataRecordInfo.FieldMetadata;
var stringFields = fieldMetadata.Where(f =>
f.FieldType.TypeUsage.EdmType.Name == StringType);
foreach (var stringField in stringFields)
{
var ordinal = stringField.Ordinal;
var curValue = curValues[ordinal] as string;
if (curValue != null && curValue.All(char.IsWhiteSpace))
curValues.SetValue(ordinal, null);
}
}
return base.SaveChanges();
}
Вопросы оптимизации:
- Определение свойства типа
string
другим способом, кроме сравнения строк. Я пытался найти некоторые перечисления встроенных типов, но не нашел
- Кэшировать строковые поля для типов (может быть, нет необходимости, придется декомпилировать и посмотреть, что делает оригинальный impl
- Упорядочить результат по типу сущности, резервному итерированному типу сущности, если следующая итерированная сущность того же типа, используйте предыдущие метаданные, опять же, если метаданные все-таки есть, производительность будет ниже, чем
- Ограничить длину строки для проверки пробелов - то есть, если длина строки> x, пропустить проверку, является ли она строкой пробелов или нет
Я использую Silverlight, а TextBox
es в пользовательском интерфейсе устанавливают все свойства строки в пустые строки.
Я попытался установить:
<TextBox
Text="{Binding MyStringProperty,
Mode=TwoWay,
ValidatesOnDataErrors=True,
TargetNullValue=''}"/>
Но это не сильно помогло.