Модель EF уже устанавливает проверку свойств объекта? - PullRequest
0 голосов
/ 13 сентября 2010

Я только что столкнулся с неожиданным поведением для объектов Entity Framework, используемых с приложением ASP.NET MVC с SQL Server в качестве хранилища данных. Для столбца, помеченного как недопустимое значение NULL, я не настроил атрибут аннотации данных Обязательный внутри частичного класса метаданных сущностей (у меня сложилось впечатление, что мне нужно было для всех свойств, которые я хочу сделать обязательными), но после проверки POST с моей точки зрения действие контроллера вернулось к тому же представлению в результате этой проверки

        // check for errors
        if (!ViewData.ModelState.IsValid)
            return View(invoice);

с описанием, что свойство не должно быть нулевым. Я специально разместил текстовое поле для свойства пустым, и у меня нет пользовательских (ручных) атрибутов аннотации данных для этого свойства.

Это код, сгенерированный мастером EF для этого свойства

    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.DateTime PayDate
    {
        get
        {
            return _PayDate;
        }
        set
        {
            OnPayDateChanging(value);
            ReportPropertyChanging("PayDate");
            _PayDate = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("PayDate");
            OnPayDateChanged();
        }
    }
    private global::System.DateTime _PayDate;
    partial void OnPayDateChanging(global::System.DateTime value);
    partial void OnPayDateChanged();

Это ошибка атрибута IsNullable для такого рода поведения? Позвольте мне прояснить, что если это действительно так, то это довольно хорошо, хотя я раньше этого не замечал и хотел бы проверить, является ли это правильным поведением или у меня там что-то не так?

1 Ответ

4 голосов
/ 13 сентября 2010

Здесь происходит несколько разных вещей.Во-первых, EF сгенерирует свойство как DateTime для столбцов даты NOT NULL в базе данных и сгенерирует Nullable для столбцов даты NULL в базе данных.Это точка первая.

Вторая точка зрения состоит в том, что MVC 2 имеет некоторое поведение «по умолчанию» в связывателе модели по умолчанию.То есть для всех типов значений он выполнит проверку (независимо от аннотаций данных), которую пользователь ввел в значение.Если они этого не сделали, он покажет подтверждение, которое вы видите в настоящее время.

Итак, это объясняет, что вы видите.Однако есть еще несколько моментов, о которых следует помнить.Во-первых, по-прежнему рекомендуется использовать атрибут [Обязательный], поскольку это позволяет настроить отображаемое пользователю сообщение об ошибке.Во-вторых, как правило, рекомендуется использовать модель представлений для ваших представлений, а не модель вашего домена EF непосредственно в ваших представлениях.Поэтому я бы рекомендовал создать модель представления (вы можете просто использовать AutoMapper для сопоставления свойств, если ваша модель представления соответствует модели вашего домена), а затем использовать аннотации данных, чтобы обеспечить более детальный контроль над метаданными, а не только проверкуно также [DisplayName], [UIHint] и т. д.

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