我正在使用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,因此在每个循环中查找区域行对我来说似乎是浪费的。
如果我将城市模型更改为以下形式:
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
}
这样对吗?我的意思是,它将为我节省对每个城市的查询,对吗?
如果是这样,那么在进行“代码优先”操作时是否有任何理由不将外来ID密钥包含在模型中?
这样对吗?我的意思是,它将为我节省对每个城市的查询,对吗?
它将一个联接保存到Regions表中。您必须使用SQL Profiler进行检查!例如:
具有ID City1,City2的城市列表(未加载区域City1 =具有RegionId 5)现在,您要查找具有ID 5的Region的任何城市。
// EF does not have to join the tables because you have the RegionId
if (myDbContext.Cities.Any(c => c.RegionId == 5))
{
}
如果是这样,那么在进行“代码优先”操作时是否有任何理由不将外来ID密钥包含在模型中?
不适合我,这是一个好习惯!只需保持一致,并对所有类型为1..n / 1..0or1的关系进行处理即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句