实体框架 6 更新,具有所需的复杂属性验证错误
本文关键字:复杂 属性 错误 验证 框架 更新 实体 | 更新日期: 2023-09-27 18:31:15
我已经使用实体框架几年了,更新过程似乎总是让我感到困惑。 我有一个包含 4 个项目的 Visual Studio MVC 解决方案。 (Web,模型,共享上下文和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();
当我这样做时,我收到一个实体验证错误,告诉我需要"邀请"属性。(确实如此,但由于延迟加载正在工作,我希望 SavedChanges 调用能够顺利工作。 好的,现在这是真正疯狂的部分。 当我拨打如下所示的电话时,它可以正常工作而不会出现错误。
int invitationId = request.Invitation.IdModel;
request.EvaluationEmailSent = true;
context.SaveChanges();
我唯一的猜测是,通过添加一些访问邀请属性的代码行,它将上下文设置为允许更新的状态。 我在这里做错了什么吗?或者,如果我没有做错任何事,为什么只是访问该属性会删除实体验证错误。
您将延迟加载设置为 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();