实体框架6更新了所需的复杂属性验证错误

时间:2014-11-19 16:08:29

标签: c# entity-framework entity-framework-6

我已经使用Entity Framework几年了,而且更新过程似乎总是让我感到困惑。我有一个包含4个项目的Visual Studio MVC解决方案。 (Web,Models,SharedContext和Windows服务)Windows服务(WS)负责监视数据库。 Web和WS项目都使用SharedContext来访问数据库。所以这里。

我花了一段时间才想到要启用懒惰,我需要将它添加到我的WS构造函数中。

context = new SharedContext();
context.Configuration.LazyLoadingEnabled = true;
context.Configuration.ProxyCreationEnabled = true;

接下来,我通过这样做来检索我的请求。

var requests = context.Requests.Where(x => x.Status == FAFSpeachDB.Models.RequestStatus.approved &&
                        DateTime.Now >= x.PresentationDate
                        && !x.EvaluationEmailSent).ToList();

这给了我一份我正在查看的实体列表。

最后,在循环访问请求列表时,我尝试更新请求对象并将其保存到数据库。

request.EvaluationEmailSent = true;
context.SaveChanges();

当我这样做时,我收到实体验证错误,告诉我“邀请”#39;物业是必需的。 (它是什么,但是因为延迟加载正在工作,我希望SavedChanges调用可以解决问题。)好的,现在这里是真正的疯狂部分。当我按如下所示拨打电话时,它可以正常工作。

int invitationId = request.Invitation.IdModel;
request.EvaluationEmailSent = true;
context.SaveChanges();

我唯一的猜测是,通过添加访问邀请属性的某行代码,它将上下文设置为允许更新的状态。我在这里做错了吗?或者,如果我没有做任何错误,为什么只访问该属性会删除实体验证错误。

1 个答案:

答案 0 :(得分:1)

您将延迟加载设置为true,这意味着在实际使用之前不会加载任何内容。因此,在您尝试访问它之前,不会加载Invitation属性,就像您在示例中所做的那样。

尝试将.Include("Invitation")(或复数"邀请")添加到原始查询中,如下所示:

var requests = context.Requests.Include("Invitation")
               .Where(x => x.Status == FAFSpeachDB.Models.RequestStatus.approved 
               && DateTime.Now >= x.PresentationDate
               && !x.EvaluationEmailSent)
               .ToList();