【问题标题】:How to avoid get all relation in Entity Framework model如何避免在实体框架模型中获取所有关系
【发布时间】:2018-01-08 11:07:23
【问题描述】:

我正在开发一个迁移应用程序,但由于源模型的关系很大,我遇到了 OutOfMemory 问题。

用一个例子更好地解释:

  • EntityA 有 6 个关系(EntityB、EntityC、EntityD...)。
  • EntityB 有 8 个关系...
  • EntityB1 有 3 个关系...

然后继续往前走。

那么问题是,当您尝试获取所有信息并执行所有过程时,应用程序会抛出 OutOfMemory 异常。

我想知道我是否可以避免某些关系,或者在不可能的情况下避免所有关系。 (以编程方式)

提前致谢

【问题讨论】:

  • 关闭延迟加载,仅“包含”您真正需要的内容。
  • 延迟加载只有在实际触发时才会出现问题。 如果在数据迁移过程中触发,则表示数据是必要的,急加载不是解决方案。
  • 请显示迁移过程的更多详细信息。目前尚不清楚为什么您认为“避免某些关系”会有所帮助,或者这是否可能(请参阅我之前的评论)。

标签: entity-framework relationship


【解决方案1】:

您正在搜索禁用延迟加载。

延迟加载意味着当您第一次访问查询中的属性时,实体将被自动且透明地加载。

使用 EDMX,您可以禁用它编辑他的属性(.edmx 文件上的 F4)。

首先使用代码,您可以使用这一行:

dbContext.Configuration.LazyLoadingEnabled = false;

现在您已禁用它,您必须在查询中包含您需要使用的关系:

dbContext.MyEntity.Include(p=> p.MyRelationProperty)
                  .Include(p=> p.MyOtherRelationProperty)
                  [...]
                  .ToList();

dbContext.MyEntity.Include("MyRelationProperty")
                  .Include("MyRelationProperty.MySubRelationProperty")
                  .Include("MyOtherRelationProperty")
                  [...]
                  .ToList();

【讨论】:

  • 为什么你认为延迟加载是问题所在?请参阅我在问题下的评论。
  • 我认为可以解决,但我必须尝试一下。还有一个问题,可以在实体列表中包含 .("x") 或 to .load() 。我想在第一次搜索后包含或加载,以提高性能。
  • @GertArnold 同意你的看法。也许是另一个原因。我测试了一个解决 90% 案例的解决方案。如果没有解决,我会删除答案。 @kartGIS 不确定我是否理解您的问题,但是可以包含.Include("MyCollectionProperty") 之类的集合
  • 对不起,我解释得不好,但我使用 dbContext.MyEntity.Include("MyRelationProperty") .Include("MyRelationProperty.MySubRelationProperty").Where(x=>x.something= 解决了该评论"是").Include("MyOtherRelationProperty").ToList()
  • 好的,@kartGIS 如果我的 anwser 对您有帮助,请随时接受它检查绿色勾号谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
相关资源
最近更新 更多