并发问题实体框架

时间:2011-03-26 11:40:35

标签: entity-framework linq-to-entities ef-code-first recursive-query entity-framework-4.1

我正在使用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联系,而这些国家又将拥有另一个国家。怎么可能建立一个递归映射?我的想法是通过以特定方式查询数据库来导航地图直到某个级别。这样做,获得良好速度性能的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

您还可以启用延迟加载。制作所有导航属性virtualtoNationNationOwnerNationAllies),除非您关闭上下文,否则所有属性都会在您首次访问后加载。