C# 实体框架6更新,出现所需的复杂属性验证错误

C# 实体框架6更新,出现所需的复杂属性验证错误,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我已经使用实体框架好几年了,更新过程似乎一直困扰着我。我有一个包含4个项目的VisualStudioMVC解决方案。(Web、模型、SharedContext和Windows服务)Windows服务(WS)负责监视数据库。Web和WS项目都使用SharedContext访问数据库。这就来了 我花了一段时间才明白,要启用lazy,我需要将其添加到我的WS构造函数中 context = new SharedContext(); context.Configuration.LazyLoadingEna

我已经使用实体框架好几年了,更新过程似乎一直困扰着我。我有一个包含4个项目的VisualStudioMVC解决方案。(Web、模型、SharedContext和Windows服务)Windows服务(WS)负责监视数据库。Web和WS项目都使用SharedContext访问数据库。这就来了

我花了一段时间才明白,要启用lazy,我需要将其添加到我的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();
这给了我一个我正在查看的实体列表

最后,在遍历请求列表时,我尝试更新请求对象并将其保存到DB

request.EvaluationEmailSent = true;
context.SaveChanges();
当我执行此操作时,会收到一个实体验证错误,告诉我需要“邀请”属性。(确实是这样,但因为惰性负载正在工作,我希望SavedChanges调用能够顺利工作。)好吧,现在是真正疯狂的部分。当我按如下所示拨打电话时,它不会出错

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

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

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

尝试向原始查询中添加
。包括(“邀请”)
(或复数“邀请”),如下所示:

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

您可以向我们展示您的模型吗?
Invitation
是复杂属性还是其他实体的导航属性?
EvaluationEmailSent
只是一个平面属性,即它不会对其setter产生副作用?此外,默认情况下,
LazyLoadingEnabled
ProxyCreationEnabled
都是
true
。效果非常好。谢谢