Как заставить EF сохранять пустые строки как NULL? - PullRequest
4 голосов
/ 14 июня 2011

В моем домене нет важного различия между NULL и пустой строкой. Как заставить EF игнорировать разницу между ними и всегда сохранять пустую строку как NULL?

Ответы [ 3 ]

5 голосов
/ 14 июня 2011

Пустая строка не является значением по умолчанию для свойства строки, поэтому он означает, что ваш код где-то устанавливает пустые строки. В таком случае это ваша обязанность.

Если вы сначала используете код с POCO, вы можете использовать пользовательский установщик:

private string _myProperty;
public string MyProperty
{
    get { return _myProperty; }
    set
    {
        if (value == String.Empty)
        {
            _myProperty = null;
        }
        else
        {
            _myProperty = value;
        }
    }
}
3 голосов
/ 08 февраля 2012

Вот функция, которую я поместил в мой подкласс 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=''}"/>

Но это не сильно помогло.

0 голосов
/ 23 июня 2011

Это не работа Entity Framework.

Вы должны сделать это в своем хранилище или в базе данных с триггерами.

Или сделать это в начале (например, когда поступают данные, пользовательский интерфейс, внешний источник и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...