【问题标题】:EF model already sets up validation on entity properties?EF 模型已经在实体属性上设置了验证?
【发布时间】:2010-09-13 02:32:45
【问题描述】:

我刚刚遇到了与使用 SQL Server 作为数据存储的 ASP.NET MVC 应用程序一起使用的实体框架实体的意外行为。对于标记为不允许为空的列,我没有在实体的元数据部分类中设置数据注释必需属性(我的印象是我必须为我希望强制执行的所有属性)但是在我的视图中的 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 属性的错吗?让我明确一点,如果确实如此,那么这非常好,尽管我以前没有注意到它并且想验证这是否是正确的行为,或者我有什么东西搞砸了?

【问题讨论】:

    标签: sql-server asp.net-mvc entity-framework


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经确定,对于这个特定的项目,我不需要 View 模型,因为它们与 EF 生成的业务模型类非常相似,如果不完全相同的话。除此之外,您的回答似乎很好。
    • 好的,但请记住我在您的项目进展时所说的话。如果没有视图模型,您可能会使事情变得比需要的更复杂。你将如何处理验证?您是否要修改生成的 EF 代码以应用您需要的各种数据注释?如果是这样,您将无法重新生成数据库更改的代码。如果您想通过应用 UIHint 或其他 UI 元数据属性来利用 MVC 丰富的元数据基础设施怎么办?这些是属于视图模型的表示问题,您希望将表示问题排除在域模型之外。
    猜你喜欢
    • 2020-09-25
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2012-06-15
    相关资源
    最近更新 更多