我正在使用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?
答案 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。
的所有关系执行此操作