我正在使用EF 4.1 CTP5和SQL Server 2008.我需要了解如何解决重复性问题。我有以下两个班级:
public class Nation
{
public int ID {get; set;}
public string name {get;set;}
public List<NationAlly> NationAllies {get;set;}
}
public class NationAlly
{
public int ID {get; set;}
public int level {get;set;}
public Nation Owner {get; set;}
public Nation toNation {get;set;}
}
实体使用两个表(Nations和NationAllies)映射到数据库。此外,还有两种关系。 1)从NationAllies.OwnerID到Nation.ID 2)从NationAllies.ToNationID到Nation.ID
当我尝试从我的数据库中检索Nation类型的对象时,我访问DbContext类NationDB:
Nation selectedNation = ((nationDB.Nations.Include("NationAllies")).Where(m => m.name == "France")).FirstOrDefault();
问题是我得到一个selectedNation对象,它有一个NationAllies列表,但列表中的每个NationAlly都有字段toNation = null。 首先,我希望字段toNation从数据库中检索正确的信息。我该怎么做?
当然,国家将与其他NationAllies联系,而这些国家又将拥有另一个国家。怎么可能建立一个递归映射?我的想法是通过以特定方式查询数据库来导航地图直到某个级别。这样做,获得良好速度性能的最佳方法是什么?
答案 0 :(得分:2)
看起来NationAllies是具有附加属性的联结表。问题是,如果您未在Include
方法中明确指定嵌入式导航属性,则EF不会急于加载嵌套导航属性。如果你想填写国家,你必须使用
nationDB.Nations.Include("NationAllies.toNation")
或
nationDB.Nations.Include(n => n.NationAllies.Select(na => na.toNation))
您还可以启用延迟加载。制作所有导航属性virtual
(toNation
,NationOwner
和NationAllies
),除非您关闭上下文,否则所有属性都会在您首次访问后加载。