1

下面的 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);
    }
}
4

1 回答 1

0

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

通过将它们设置为自己,您调用 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(实体框架会以一种或另一种方式计算出来)。

于 2013-10-11T13:40:20.657 回答