实体框架 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();

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

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

您将延迟加载设置为 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();