Проверка на стороне сервера REQUIRED String Property в MVC2 Entity Framework 4 не работает
Я пытаюсь выполнить проверку подлинности структуры Entity Framework на стороне сервера. Другие проверки на стороне сервера, такие как проверка типа данных и требуемые свойства DateTime и числовые EF, работают.
Это в VS 2010,.NET 4.0, MVC2 + Cloud, ADO.Net Entity Framework.
У свойства String, с которым я столкнулся, сопоставляется с столбцом столбцов SQL 2008, Varchar (50).
Когда я пытаюсь отправить свое действие Create с пустой строкой для этого свойства, я получаю ошибку follwing.
Сведения об исключении: System.Data.ConstraintException: для этого свойства не может быть установлено значение null.
Когда я отправляю сообщение в действие с пустым пространством, я успешно получаю требуемое сообщение проверки поля.
Я попытался использовать Data Annotations и ClientSideValidation, но, похоже, проблемы с ClientSideValidation работают над частичными представлениями и диалоги jquery.
Вот оригинальный автогенерированный код из структуры сущности.
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.String GradeTypeName
{
get
{
return GradeTypeName;
}
set
{
OnGradeTypeNameChanging(value);
ReportPropertyChanging("GradeTypeName");
_GradeTypeName = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("GradeTypeName");
OnGradeTypeNameChanged();
}
}
В зависимости от сигнатуры метода Action (CREATE или EDIT) исключение может возникнуть перед тем, как вступить в метод или внутри метода, когда вызывается UpdateModel(). Внутреннее исключение находится в строке ниже из файла model.designer.cs.
_GradeTypeName = StructuralObject.SetValidValue(value, false);
Я смог воспроизвести это на простом веб-приложении mvc2.
Ответы
Ответ 1
У меня была та же проблема на некоторое время. Я нашел здесь несколько объяснений: http://mvcmusicstore.codeplex.com/workitem/6604. Короче говоря, исключение " System.Data.ConstraintException: это свойство не может быть установлено на нулевое значение", генерируется с помощью проверки свойств Entity. Эта проверка выполняется, когда ваше приложение mvc пытается привязать поле формы к соответствующему свойству объекта (он называется PreBinding Validation, и это происходит при отправке формы). Поскольку поле пусто (поэтому конвертируется в null), связующее пытается связать нулевое значение с этим свойством, что нарушает ограничение Non-Null на свой объект entity.
Но если вы публикуете пустое поле (отличное от пустого, поэтому null), проверка подлинности объекта проходит (поскольку свойство больше не установлено на значение null), а затем ваше сообщение появляется из аннотации "Требуется" валидация, которая выполняется после предварительной привязки (это Проверка послепечати).
Обходной путь заключается в использовании аннотации [DisplayFormat (ConvertEmptyStringToNull = false)], которая сообщает связующему, чтобы не преобразовать пустую строку в нуль.
[Required]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string YourStringProperty { get; set;}
Надеюсь, это поможет!
Ответ 2
Это было очень полезно. Я использую MVC3 и структуру сущности. Я передавал свои объекты непосредственно в контроллер, но получал ту же ошибку, когда форма была пустой. С инфраструктурой сущностей вы можете выполнять проверку данных, редактируя автоматически сгенерированный код, но создание отдельного частичного класса объекта работало лучше для меня.
[MetadataType(typeof(TestEntityValidation))]
public partial class TestEntity{
}
public class TestEntityValidation{
[Required]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public String name { get;set}
}
Ответ 3
Иногда в первом подходе базы данных в EF вы можете обновить свой столбец от not null
до null
с помощью SQL-запроса и использовать "Обновить модель из базы данных..." (в правом щелчке EDMX), то, возможно, свойство этот объект не обновляется должным образом, и поэтому, если у вас есть некоторые данные null
в этом столбце, при сопоставлении происходит нарушение и отображается эта ошибка.
Исправить это; Вы можете проверить Nullable
в свойствах этого свойства объекта, который вы его обновили.