【问题标题】:Entity Framework 6 update with required complex property validation error带有所需复杂属性验证错误的实体框架 6 更新
【发布时间】:2014-11-20 00:26:22
【问题描述】:

我已经使用实体框架几年了,更新过程似乎总是让我感到困惑。我有一个包含 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();

当我这样做时,我收到一个实体验证错误,告诉我需要“邀请”属性。 (确实如此,但由于延迟加载正在工作,我希望 SavedChanges 调用能够顺利工作。)好的,现在这是真正疯狂的部分。当我如下所示拨打电话时,它可以正常工作。

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

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

【问题讨论】:

  • 你能告诉我们你的模型吗?
  • Invitation 是复杂属性还是不同实体的导航属性?
  • EvaluationEmailSent 只是一个平面属性,即它不会在其设置器中引起副作用吗?此外,LazyLoadingEnabledProxyCreationEnabled 默认为 true

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


【解决方案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();

【讨论】:

  • 效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多