【问题标题】:Recurrency problem Entity Framework递归问题实体框架
【发布时间】: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


【解决方案1】:

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

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

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

您还可以启用延迟加载。将所有导航属性设为virtualtoNationNationOwnerNationAllies),除非您关闭上下文,否则所有属性将在您首次访问它们时加载。

【讨论】:

  • 很好。使用方法 #1 解决了问题。方法#2 看起来很有趣:如果我理解正确,上下文会在我访问对象时将它们加载到内存中吗?这意味着,即当我将地图“导航”到该属性时,toNation 属性将自动检索数据库值?
  • 是的,它是数据库中选择语句的延迟执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2015-02-24
相关资源
最近更新 更多