Проверка на стороне сервера 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 в свойствах этого свойства объекта, который вы его обновили.