Это было мое решение этой проблемы, которая не велика, но управляема.
В моей модели я аннотированный свойство с:
[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
}
Параметр '[Требуется]' атрибут не имеет особого смысла в этом случае. Если у вас есть значение по умолчанию, нет смысла «притворяться» поле обязательным. –
Я согласен с вами, но поскольку это строка, если я не укажу [Обязательный], поле varchar становится нулевым в базе данных (чего я не хочу). – Brad
Это известная проблема в EF. Насколько я знаю, это исправлено в EF 7. См. Https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2929682-support-database-default-values-in-code -первый. На данный момент ваш единственный выбор - объявить «ограничение по умолчанию» с помощью TSQL. Извините, я думал, что вы уже об этом знаете. –