代码之家  ›  专栏  ›  技术社区  ›  mare

EF模型已经对实体属性设置了验证吗?

  •  0
  • mare  · 技术社区  · 15 年前

    我刚刚遇到了一个与一起使用的实体框架实体的意外行为ASP.NET以sqlserver作为数据存储的MVC应用程序。对于标记为not null allowed的列,我没有在实体的元数据部分类中设置data annotation Required属性(我认为我必须为所有希望强制设置的属性设置数据注释),但是在从我的视图发布之后,控制器操作返回到同一视图,这是此检查的结果

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

        [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();
    

    1 回复  |  直到 15 年前
        1
  •  4
  •   John Farrell    15 年前

    这里发生了一些不同的事情。首先,EF将为数据库中的notnull date列生成属性as DateTime,并为数据库中的NULL date列生成Nullable。这是第一点。

    第二点是mvc2在默认模型绑定器中有一些“默认”行为。也就是说,对所有人来说 值类型 它将执行用户输入值的验证(独立于数据注释)。如果他们没有这样做,它将显示您当前看到的验证。

    所以这就解释了你所看到的。不过,还有几点需要记住。首先,使用[Required]属性仍然是一种很好的做法,因为它允许您自定义显示给用户的错误消息。其次,通常认为最佳实践是为视图使用视图模型,而不是直接在视图中使用EF域模型。因此,我建议创建一个视图模型(如果视图模型与域模型匹配,可以使用AutoMapper映射属性),然后使用数据注释对元数据提供更细粒度的控制—不仅是验证,还包括[DisplayName]、[UIHint]等。