5

我有一个自动生成的实体框架模型。它是使用数据库优先方法生成的。该mid_initial列具有数据库定义的约束,该约束将列的最大长度限制为 3 个字符。

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Agency.DataAccess.RegistrationModel
{
    using System;
    using System.Collections.Generic;

    public partial class Registrant
    {
        public Registrant()
        {
        }

        public int id { get; set; }
        public string fname { get; set; }
        public string mid_initial { get; set; }
        public string lname { get; set; }
    }
}

当我尝试创建一个mid_initial大于 3 个字符的模型时,无效状态ModelState.IsValid正在返回 true。因为这个db.SaveChanges,然后被跟注,然后加注DbEntityValidationException

[HttpPost]
public ActionResult Create(Registrant registrant)
{    
    try
    {
        if (ModelState.IsValid)
        {
            Debug.WriteLine("Entity was valid.");
            db.Registrants.Add(registrant);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View("Create", registrant);
    }
    catch (DbEntityValidationException e)
    {
        foreach (var eve in e.EntityValidationErrors)
        {
            Debug.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                eve.Entry.Entity.GetType().Name, eve.Entry.State);
            foreach (var ve in eve.ValidationErrors)
            {
                Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                    ve.PropertyName, ve.ErrorMessage);
            }
        }
        return View(registrant);
    }
}

为什么ModelState.IsValid方法返回true?我的模型似乎不知道最大长度约束。我如何让它知道?

4

2 回答 2

5

EF db-first 无法从数据库推断约束。

使用MaxLenght数据注释属性:

public partial class Registrant
{
    public Registrant()
    {
    }

    public int id { get; set; }
    public string fname { get; set; }
    [MaxLength(3, ErrorMessage = "")]
    public string mid_initial { get; set; }
    public string lname { get; set; }
}

注意:这个类是一个自动生成的类,每次你更新和保存你的模型(.EDMX 文件),这个代码都会被覆盖,你会失去你的属性。

为避免这种情况,您应该使用一些与自动生成的类具有相同名称和相同命名空间的部分类来扩展您的类。如果您需要示例来告诉您如何操作,请告诉我回答。

于 2013-07-31T14:13:42.010 回答
3

MVC 与 EF 无关,因此不会隐式尝试使用 EF 验证来验证模型以填充其 ModelState。

你有四个我现在能想到的基本解决方案:

  • 自己连接它们,例如使用 MVC 过滤器、DbContext.GetValidationErrors 和 ModelState。
  • 查找并使用已经执行此操作的第三方代码。
  • 使用 MVC 可以使用的工具单独验证代码,例如使用 DataAnnotations。您可以尝试通过修改 EF T4 模板来自动生成它们。请注意,这在技术上仍然是多余的(代码将被验证两次,一次由 MVC,一次由 EF)。
  • 为 MVC 提交一个补丁,以便它可以显式支持 EF(作为依赖项)并使其一切正常(两个项目都是开源的)——或者因为他们已经这样做而我不知道,所以对我投反对票。
于 2013-07-30T16:15:38.140 回答