Проверка на стороне сервера НЕОБХОДИМОГО свойства строки в 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 пустую строку для этого свойства, я получаю следующую ошибку.
Сведения об исключении: System.Data.ConstraintException: для этого свойства не может быть установлено нулевое значение.
При публикации в действии с пустым пространством я успешно получаю сообщение о проверке обязательного поля.
Я пытался использовать аннотации данных и 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.
3 ответа
У меня была такая же проблема некоторое время. Я нашел объяснение здесь: http://mvcmusicstore.codeplex.com/workitem/6604. Короче говоря, исключение " System.Data.ConstraintException: это свойство не может быть установлено в нулевое значение " генерируется проверкой свойства сущности. Эта проверка выполняется, когда ваше приложение mvc пытается связать поле формы с соответствующим свойством объекта (оно называется PreBinding Validation и происходит при отправке формы). Поскольку поле пустое (поэтому преобразуется в нулевое значение), средство связывания пытается привязать нулевое значение к свойству, что нарушает ограничение ненулевого свойства вашей сущности.
Но если вы отправляете сообщение с пустым полем (которое отличается от пустого, следовательно, пустым), проверка сущности проходит (поскольку свойство больше не имеет нулевого значения), и затем вы видите сообщение из проверки обязательных аннотаций, что выполняется после предварительной привязки (это проверка после привязки).
Обходной путь должен использовать аннотацию [DisplayFormat(ConvertEmptyStringToNull = false)], которая указывает связующему не преобразовывать пустую строку в ноль.
[Required]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string YourStringProperty { get; set;}
Надеюсь это поможет!
Это было очень полезно. Я использую MVC3 и платформу сущностей. Я передавал свои сущности прямо в контроллер, но получал ту же ошибку, когда форма была пустой. С помощью Entity Framework вы можете выполнить проверку данных, отредактировав автоматически сгенерированный код, но создание отдельного частичного класса объекта сработало для меня лучше.
[MetadataType(typeof(TestEntityValidation))]
public partial class TestEntity{
}
public class TestEntityValidation{
[Required]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public String name { get;set}
}
Иногда в базе данных первый подход в EF, вы можете обновить свой столбец из not null
может быть null
используя SQL-запрос и используйте "Обновить модель из базы данных..." (в EDMX, щелкните правой кнопкой мыши), тогда, возможно, свойство этой сущности не будет обновлено должным образом, и если у вас есть некоторые null
данные в этом столбце, в отображении, нарушение происходит, и эта ошибка показана.
Чтобы это исправить; Вы можете проверить Nullable
в свойствах того свойства объекта, который вы обновили.