【问题标题】:LINQ with EF6: Losing second reference in two column table带有 EF6 的 LINQ:在两列表中丢失第二个引用
【发布时间】:2025-11-24 20:25:08
【问题描述】:

我这里有个奇怪的问题。

在我的数据库中,我有一个名为“NeighbourCountry”的表: 它由一个来源国和一个相关的邻国组成。

public class NeighbourCountry
    {
        [Key]
        public int NeighbourCountryID { get; set; }

        public Country Source { get; set; }

        public Country Neighbour { get; set; }
    }

它是这样填充的:

source_a,neighbour_x
source_a,neighbour_u
source_a,neighbour_t
source_b,neighbour_n
source b,neighbour_p

现在我只想用一个简单的方法得到一个国家的邻居: (为了方便调试,我只尝试获取一个国家的FIRST邻居)

private string GetNeighbours(ApplicationDbContext context, Country paracountry)
        {
            var neighbours = context.NeighbourCountries.Where(b => b.Source.CountryID == paracountry.CountryID).FirstOrDefault();
            return "";
        }

现在,当我将鼠标悬停在“邻居”上时,我得到了这个:

如您所见,它确实找到了源国家,但说它没有邻居。 那是不正确的,数据库中充满了这些数据:

在这种情况下,源国家是 ID 为 1 的国家。 在数据库中,ID 为 1 的国家/地区与其邻国正确列出。

现在是更奇怪的部分: 当我反过来尝试时,直接LINQing到邻居而不是源,我得到了同样的场景,只是反过来。

var neighbours = context.NeighbourCountries.Where(b => b.Neighbour.CountryID == paracountry.CountryID).FirstOrDefault();

正如我所说,然后我明白了:

所以 Linq 确实找到了这个邻居,但现在它找不到第一个关联的源国家。 我好像无法连接来源国和邻国。

你知道可能是什么问题吗?

非常感谢!

【问题讨论】:

    标签: c# asp.net-mvc linq entity-framework ef-code-first


    【解决方案1】:

    我会说只是延迟加载的问题。

    如果您想检索 Neighbor 和 Source,请使用 Include 预加载它们

    context.NeighbourCountries
             .Include(m => m.Neighbour)
             .Include(m => m.Source)
             .Where(b => b.Neighbour.CountryID == paracountry.CountryID).FirstOrDefault();
    

    (实际上,您不需要在 where 子句中包含相关实体,但这可能会让事情更清楚)。

    【讨论】:

    • 解决了这个问题,非常感谢!我不明白这里发生了什么,以及为什么会这样......但谢谢你:D
    • 试着去了解“延迟加载”和“急切加载”,这会有所帮助;)