一个或多个实体的ASP.NET验证失败

时间:2014-01-02 14:24:23

标签: c# asp.net asp.net-mvc entity-framework

我有一个数据库驱动的asp.net mvc应用程序它有许多外键关系但由于某种原因,其中一个表我遇到了外键和下拉框的问题,当我想创建一个新的记录我输入所有字段,然后在下拉框中选择一个外键值,但是当我点击保存时会抛出此错误。

  

一个或多个实体的验证失败。看到   'EntityValidationErrors'属性以获取更多详细信息。代码优先

我知道这是导致这种情况的下拉列表,因为我运行了一个try catch,它创建了一个.txt文件,它输出错误特定的细节,因为堆栈跟踪没有太多细节。我没有做任何与正常情况不同的事情。

我已按照模型

完成此操作
    public virtual Employee Employee { get; set; }
    public virtual Employee Employee1 { get; set; }
    public virtual Fuel_Card Fuel_Card { get; set; }
    public virtual Vehicle Vehicle { get; set; }

这与控制器第一创建方法

相同
    public ActionResult Create()
    {
        ViewBag.emp1 = new SelectList(db.Employees, "Employee_ID", "Employee_ID");
        ViewBag.emp2 = new SelectList(db.Employees, "Employee_ID", "Employee_ID");
        ViewBag.FuelCardNumber = new SelectList(db.Fuel_Card, "Fuel_Card_Number", "Fuel_Card_Number");
        ViewBag.Registration = new SelectList(db.Vehicles, "Registration", "Registration");
        return View();
    }

这是在第二次

        ViewBag.emp1 = new SelectList(db.Employees, "Employee_ID", "Employee_ID", fuel_allocation.Requesting_Employee);
        ViewBag.emp2 = new SelectList(db.Employees, "Employee_ID", "Employee_ID", fuel_allocation.Authorising_Employee);
        ViewBag.FuelCardNumber = new SelectList(db.Fuel_Card, "Fuel_Card_Number", "Fuel_Card_Number", fuel_allocation.Fuel_Card_Number);
        ViewBag.Registration = new SelectList(db.Vehicles, "Registration", "Registration", fuel_allocation.Registration_Number);

这在创建视图中

    <div class="editor-field">
        @Html.DropDownList("emp2", String.Empty)
        @Html.ValidationMessageFor(model => model.Authorising_Employee)
    </div>

我想知道是否有人之前有这个问题?我尝试了各种不同的东西,当我使用EditorFor时外键关系有效,但是当我在使用下拉列表时尝试提交它时,它总是说它是空的。

我认为它可能会为2个选择列表使用相同的数据库字段,但事实并非如此,因为我已经单独测试了它们

这是我输出到文件

时得到的错误
  

02/01/2014 14:52:56:状态为“已添加”的“Fuel_Allocation”类型的实体   有以下验证错误:    - 属性:“Authorising_Employee”,错误:“Authorising_Employee字段是必需的。”

1 个答案:

答案 0 :(得分:1)

EntityValidationErrors应包含您需要的所有详细信息。尝试将此代码添加到派生的Context类中:

public override int SaveChanges()
{
    try
    {
        base.SaveChanges();
    }
    catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
    {
        Exception exception = dbEx;
        foreach (var validationErrors in dbEx.EntityValidationErrors)
        {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
                string message = string.Format("{0}:{1}", 
                    validationErrors.Entry.Entity.ToString(),
                    validationError.ErrorMessage);

                //create a new exception inserting the current one
                //as the InnerException
                exception = new InvalidOperationException(message, exception);
            }
        }
        throw exception;
    }
}