Проверка на стороне сервера НЕОБХОДИМОГО свойства строки в MVC2 Entity Framework 4 не работает - PullRequest
14 голосов
/ 28 июня 2010

Я пытаюсь заставить проверку на стороне сервера свойства строки Entity Framework работать. Другие проверки на стороне сервера, такие как проверка типа данных и требуемые свойства dateTime и числовой EF, работают.

Это в VS 2010, .Net 4.0, MVC2 + Cloud, ADO.Net Entity Framework.

Свойство String, с которым у меня возникают проблемы, сопоставлено с необнуляемым столбцом SQL 2008, Varchar (50).

Когда я пытаюсь опубликовать в своем действии Создать пустую строку для этого свойства, я получаю следующую ошибку.

Сведения об исключении: 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 ]

30 голосов
/ 12 сентября 2010

У меня была такая же проблема некоторое время.Я нашел здесь объяснение: http://mvcmusicstore.codeplex.com/workitem/6604.Короче говоря, исключение " System.Data.ConstraintException: это свойство не может быть установлено в нулевое значение " генерируется проверкой свойства сущности.Эта проверка выполняется, когда ваше приложение mvc пытается связать поле формы с соответствующим свойством объекта (оно называется Проверка предварительного связывания и происходит при отправке формы).Поскольку поле пустое (поэтому преобразуется в нулевое значение), средство связывания пытается привязать нулевое значение к свойству, что нарушает ограничение ненулевого значения для свойства вашей сущности.

Но если вы публикуете пустое поле(отличается от пустого, следовательно, null) Проверка сущности проходит (так как для свойства больше не устанавливается нулевое значение), и затем вы видите сообщение из проверки «Required» аннотации, которая выполняется после предварительной привязки (это Проверка правильности привязки ).

Обходное решение - использовать аннотацию [DisplayFormat (ConvertEmptyStringToNull = false)] , которая указывает связующему не преобразовывать пустую строку в ноль.

  [Required]
  [DisplayFormat(ConvertEmptyStringToNull = false)]
  public string YourStringProperty { get; set;}

Надеюсь, это поможет!

4 голосов
/ 18 сентября 2011

Это было очень полезно. Я использую MVC3 и Entity Framework. Я передавал свои сущности прямо в контроллер, но получал ту же ошибку, когда форма была пустой. С помощью Entity Framework вы можете выполнить проверку данных, отредактировав автоматически сгенерированный код, но создание отдельного частичного класса объекта работало для меня лучше.

[MetadataType(typeof(TestEntityValidation))]
public partial class TestEntity{
}

public class TestEntityValidation{
    [Required]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public String name { get;set}
}
2 голосов
/ 12 апреля 2013

Иногда при первом подходе к базе данных в EF вы можете обновить столбец с not null до null, используя SQL-запрос, и использовать «Обновить модель из базы данных ...» (в EDMX, щелкните правой кнопкой мыши), а затем, возможно, свойство эта сущность не обновлена ​​должным образом, поэтому, если в этом столбце есть данные null, при сопоставлении возникает нарушение и отображается эта ошибка.

Чтобы исправить это ; Вы можете проверить Nullable в Свойствах того свойства объекта, который вы обновили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...