我已经使用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();
我唯一的猜测是,通过添加访问邀请属性的某行代码,它将上下文设置为允许更新的状态。我在这里做错了吗?或者,如果我没有做任何错误,为什么只访问该属性会删除实体验证错误。
答案 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();