【发布时间】:2011-03-26 11:40:35
【问题描述】:
我正在使用 EF 4.1 CTP5 和 SQL Server 2008。我需要了解如何解决递归问题。我有以下 2 个课程:
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。怎么可能建立一个递归地图?我的想法是通过以特定方式查询数据库,将地图导航到某个级别。这样做,获得良好速度性能的最佳方法是什么?
【问题讨论】:
-
如何映射这些实体。首先,您的代码与您的查询不对应,因为
Nation中的name是整数。此外,默认映射会将toNation指向父实体,在您的情况下为法国。不会有递归。 -
1) 更正了 Nation.name 中的错误类型 2) 添加了关于映射的描述
-
@Ladislav:从某种意义上说,你有递归,每个国家都可以有几个 NationAlly(s)。每个 NationAlly 在 toNation 字段中都有一个 Nation,而在轮到他时,可以有多个 NationAlly。在这种情况下,会创建一个完整的分层组织或地图。地图的边界当然可以是有限的(以不产生新分支的“叶子”结束,即没有盟友的国家)或无限的(国家都相互联系)
标签: entity-framework linq-to-entities ef-code-first recursive-query entity-framework-4.1