在Code First中包含外键ID以保存查询?

时间:2016-08-12 15:15:44

标签: database entity-framework foreign-keys entity-framework-6

我正在使用Entity Framework 6 Code First。

现在我的模型看起来如下:

public class Region
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<City> Cities { get; set; }
}

public class City
{
    public int Id { get; set; }
    public string Name { get; set; }
    [Required]
    public virtual Region Region { get; set; }
}

问题是,我得到了一份城市名单。 我需要查找每个城市的区域(我也有一个本地区域列表)。

现在,我想我可以做到以下几点:

    foreach (var c in cities)
    {
        if (regions.Any(x => x.Id == c.Region.Id))
    }

在这里,我将不得不从数据库中查找每个城市的区域(延迟加载)。 但是,我只需要该区域的Id,因此在每个循环中查找区域行似乎很浪费。

如果我将City模型更改为以下内容:

public class City
{
    public int Id { get; set; }
    public string Name { get; set; }
    [ForeignKey("Region")]
    public int RegionId { get; set; }
    [Required]
    public virtual Region Region { get; set; }
}

我可以改为:

foreach (var c in cities)
    {
        if (regions.Any(x => x.Id == c.RegionId)) //no region lookup at Im using the foreign id key
    }

这是对的吗?我的意思是它会为我节省每个城市的查询吗?

如果是这样,在执行Code First时是否有任何理由不在模型中包含外键id?

1 个答案:

答案 0 :(得分:1)

  

这是对的吗?我的意思是它会为每个城市保存一个查询吗?

它会将连接保存到Regions表。你必须使用SQL Profiler检查它!例如:

具有Id City1,City2的城市列表(未加载区域City1 =具有RegionId 5) 现在您正在寻找任何城市都有Id 5的区域。

// EF does not have to join the tables because you have the RegionId
if (myDbContext.Cities.Any(c => c.RegionId == 5))
{
} 
  

如果是这样,是否有任何理由不在其中包含外来id键   什么时候做Code First的模型?

不,对我来说这是一个很好的做法!只需保持一致,并为类型1..n / 1..0or1。

的所有关系执行此操作