2

我正在使用 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 从数据库中检索正确的信息。我该怎么做呢?

然后当然 toNation 将与其他 NationAllies 连接,而后者又将拥有另一个 Nation。怎么可能建立一个递归地图?我的想法是通过以特定方式查询数据库,将地图导航到某个级别。这样做,获得良好速度性能的最佳方法是什么?

4

1 回答 1

2

看起来 NationAllies 是具有附加属性的连接表。Include问题是,如果您没有在方法中明确指定嵌套导航属性,EF 不会急于加载它们。如果你想填充 toNation,你必须使用

nationDB.Nations.Include("NationAllies.toNation")

或者

nationDB.Nations.Include(n => n.NationAllies.Select(na => na.toNation))

您还可以启用延迟加载。创建所有导航属性virtualtoNation和),除非您关闭上下文NationOwnerNationAllies否则所有属性将在您第一次访问它们时加载。

于 2011-03-26T16:38:19.317 回答