LINQ with EF6:在两列表中丢失第二个引用

时间:2014-06-18 11:57:15

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

我这里有一个奇怪的问题。

在我的数据库中,我有一个名为" 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

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

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

现在,当我将鼠标悬停在"邻居"时,我明白了: enter image description here

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

enter image description here

此案例中的来源国家/地区是ID为1的国家/地区。 在数据库中,ID为1的国家/地区与其邻居正确列出。

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

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

正如我所说,然后我明白了: enter image description here

所以Linq找到了这个邻居,但现在它无法找到第一个相关的来源国。 我似乎无法连接源国和邻国。

你知道可能出现什么问题吗?

非常感谢你!

1 个答案:

答案 0 :(得分:1)

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

如果要检索“邻居”和“源”,请使用“包含”

逐步加载它们
context.NeighbourCountries
         .Include(m => m.Neighbour)
         .Include(m => m.Source)
         .Where(b => b.Neighbour.CountryID == paracountry.CountryID).FirstOrDefault();

(事实上,你不需要包含where子句中的相关实体,但这可能使事情更清楚。)