Проверка на стороне сервера НЕОБХОДИМОГО свойства строки в 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 в свойствах того свойства объекта, который вы обновили.

Другие вопросы по тегам