EF 急切加载与延迟加载

时间:2021-02-05 13:36:12

标签: c# mysql entity-framework

有人可以向我解释我做错了什么吗?

我在 C# 应用程序上使用 Entity Framework 6 和 MySQL。我有很多一对多的关系,我需要抓取所有关联的数据才能在屏幕上显示。

使用延迟加载,需要花费大量时间来拉取数据。我正在运行此查询:

Lot foundLot = EntitiesContext.Lots.Where(x => x.ID == lotID).FirstOrDefault();

这将返回与该 ID 匹配的第一个批次,当我调用后续子项时,它将加载它们。这工作正常,但速度很慢。

我想尝试进行 Eager Loading,但是当我调用“Include”函数时,我的所有数据都被混淆了,并且错误的东西被关联起来。

我就是这样做的:

Lot foundLot = EntitiesContext.Lots.Where(x => x.ID == lotID)
            .Include("Parts")
            .Include("Parts.Bin")
            .Include("Parts.Stations")
            .Include("Parts.Stations.Tools")
            .Include("Parts.Stations.Tools.Measurements")
            .AsNoTracking()
            .FirstOrDefault();

注意:我也尝试过使用 Include LINQ 版本

.Include(x => x.Parts.Select(p => p.Stations));

它正确地拉出批次、零件、箱和站,但是当它拉出工具时,它使用的是零件 ID 而不是相关的站 ID。

我已经确认我的外键设置正确。我正在使用代码优先实现,所以当我查看我的 Tool.cs 文件时:

public int? StationID { get; set; }

[ForeignKey("StationID")]
public virtual Station Station { get; set; }

我将我的外键定义为 Station ID,然后在我的 Station 中:

[Key]
public int ID { get; set; }

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Tool> Tools { get; set; }

并且我有一个将创建我的外键的迁移:

AddForeignKey("tools", "StationID", "stations", "ID", true, "FK_Tools_Stations_StationID");

就像我说的,延迟加载一切都很好。只是很慢。 Eager Loading 混合数据,为什么?

谢谢。

0 个答案:

没有答案