2016-08-25 3 views
4

У меня есть код EF. Первая настройка. У меня есть конкретный столбец, который помечен как обязательный для аннотации. Этот столбец имеет ограничение по умолчанию, указанное в базе данных.Entity Framework Обязательный параметр по умолчанию

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

Если я ничего не введу, необходимая ошибка отображается в форме. Если я добавляю аннотацию [DatabaseGenerated(DatabaseGeneratedOption.Computed)], значение, которое вводит пользователь, игнорируется и всегда использует базу данных по умолчанию.

+1

Параметр '[Требуется]' атрибут не имеет особого смысла в этом случае. Если у вас есть значение по умолчанию, нет смысла «притворяться» поле обязательным. –

+0

Я согласен с вами, но поскольку это строка, если я не укажу [Обязательный], поле varchar становится нулевым в базе данных (чего я не хочу). – Brad

+1

Это известная проблема в EF. Насколько я знаю, это исправлено в EF 7. См. Https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2929682-support-database-default-values-in-code -первый. На данный момент ваш единственный выбор - объявить «ограничение по умолчанию» с помощью TSQL. Извините, я думал, что вы уже об этом знаете. –

ответ

0

Это было мое решение этой проблемы, которая не велика, но управляема.

В моей модели я аннотированный свойство с:

[DefaultValueSql("'A'")] 
[DefaultValue("A")] 
[Required] 

DefaultValueSql является пользовательский атрибут, который обрабатывает создание значений столбцов SQL по умолчанию при выполнении миграции. Значение DefaultValue соответствует этому значению. Я знаю, что это нарушение DRY, но использование этого решения в любом случае устраняет необходимость по умолчанию в базе данных (возможно, я удалю его в будущем).

В моем контроллере, на Create/Edit ActionResult почтовых обработчиков я добавил это:

if (model.ActiveIndicator == null) 
    { 
     model.ActiveIndicator = ((DefaultValueAttribute)(model.GetType().GetProperty("ActiveIndicator").GetCustomAttributes(typeof(DefaultValueAttribute), true).First())).Value.ToString(); 
     ModelState["ActiveIndicator"].Errors.Clear(); // Removes Model Error 
    } 

Это устанавливает по умолчанию в DefaultValue, перечисленных в аннотации и удаляет ошибку ModelState для этого свойства, позволяющего ModelState. IsValid - true.

Это решение хорошо подходит для строковых значений по умолчанию, однако нестроковые (типы, которые не могут быть пустыми), вероятно, должны выполняться по-разному, возможно, в конструкторе класса модели.

Edit: Если вы используете TryUpdateModel, вы должны установить значение ModelState вместо представленного значения модели:

if (model.ActiveIndicator == null) 
    { 
     var defValue = ((DefaultValueAttribute)(model.GetType().GetProperty("ActiveIndicator").GetCustomAttributes(typeof(DefaultValueAttribute), true).First())).Value.ToString(); 
     ModelState.SetModelValue("ActiveIndicator", new ValueProviderResult(defValue, "", CultureInfo.InvariantCulture)); 
     ModelState["ActiveIndicator"].Errors.Clear(); // Removes Model Error 
    } 
0

Что вы можете сделать, это выполнить магию при анализе значений форм.

При проверке для конкретного столбца ввода данных пользователя из формы, проверьте столбец с помощью

if (!String.IsNullOrWhiteSpace(value)) 
    //set the value in the database entry based on user's input 

выше фрагмент кода только вводит значение в базу данных если что-то было введено в форме.

Это решение работает только в том случае, если вы можете анализировать значения формы после того, как пользователь «отправил».

+0

Если база данных имеет ограничение по умолчанию, эта проверка совершенно не нужна. –

Смежные вопросы