SaveChanges()异常,抱怨已经缺少的字段

时间:2013-10-11 13:31:46

标签: asp.net-mvc entity-framework

下面的ActionResult曾经工作但最近停止了工作。 db.SaveChanges()会引发异常,抱怨需要UserClass字段。但他们已经在那里了!如果我只是将UserClass设置为已存在的值...

            item.User = item.User;
            item.Class = item.Class;

然后异常就消失了。显然这里有一些我误解的东西。如果这段代码失败,我该如何更新记录的字段?

感谢您的见解!!

    public ActionResult ApproveChange(int id)
    {
        var item = db.EnrollmentItems.FirstOrDefault(x => x.ID == id);

        if (item != null
            && item.State == EnrollmentState.Submitted
            && LoginUser.IsManager(ClientBusiness))
        {
            item.State = EnrollmentState.Approved;
            item.LastTouch = DateTime.UtcNow;
            db.SaveChanges();
            return Json(new { State = item.State });
        }
        return Json(new { State = "error" });
    }

这是类定义

public class EnrollmentItem
{
    public int ID { get; set; }
    [Required]
    public virtual User User { get; set; }
    [Required]
    public virtual Class Class { get; set; }
    public string Action { get; set; }
    public string State { get; set; }
    public DateTime LastTouch { get; set; }

    public override string ToString()
    {
        return 
            String.Format("{0} {1} {2} {3} {4}",
            User, Action, ID, State, Class);
    }
}

1 个答案:

答案 0 :(得分:0)

您收到此错误是因为实体框架拒绝使用缺少必需属性的模型转到数据库。它是null,因为你从未从数据库中提取它。

通过设置它们自己来调用get方法+ set方法,这将触发延迟加载,这将从数据库中获取用户和类对象。
要直接执行此操作,您可以在firstOrDefault调用中包含这两个属性,如下所示:

var item = db.EnrollmentItems
               .Include(x=>x.User)
               .Include(x=>x.Class)
               .FirstOrDefault(x => x.ID == id);

如果您不想包含它们,我猜您也可以在模型上添加外键属性,这样您就不必加入表格。你的班级会这样看:左

public class EnrollmentItem
{
    public int ID { get; set; }

    public virtual User User { get; set; }
    public int UserId{get;set;}
    public virtual Class Class { get; set; }
    public int ClassId{get;set;}
    public string Action { get; set; }
    public string State { get; set; }
    public DateTime LastTouch { get; set; }

    public override string ToString()
    {
        return 
            String.Format("{0} {1} {2} {3} {4}",
            User, Action, ID, State, Class);
    }
}

您必须在映射类中指定必需,但随后可以更新并插入虚拟属性或foreignkeyId(实体框架将以这种或那种方式解决)。