2

我正在使用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;} 
} 

的实体映射到两个表(国家和NationAllies)数据库。此外,还有两种关系。 1)从NationAllies.OwnerID到Nation.ID 2)从NationAllies.ToNationID到Nation.ID

当我尝试从我的数据库检索国家类型的对象,我访问的DbContext类NationDB:

Nation selectedNation = ((nationDB.Nations.Include("NationAllies")).Where(m => m.name == "France")).FirstOrDefault(); 

问题是我得到一个具有NationAllies列表的selectedNation对象,但列表中的每个NationAlly都具有toNation = null的字段。 首先,我希望字段toNation从数据库中检索正确的信息。我该怎么做呢?

当然,国家将与其他国家联盟相连,而联盟其他国家也将拥有其他国家。怎么可能建立一个递归图?我的想法是通过以特定方式查询数据库来导航地图直到某个级别。这样做,有什么最好的方法来获得良好的速度表现?

+0

你如何映射这些实体。首先,您的代码不会与您的查询进行核对,因为'Nation'中的'name'是整数。另外默认的映射会把'toNation'指向你的情况下的父实体法国。不会有递归。 – 2011-03-26 14:18:35

+0

1)更正了Nation.name中的错误类型2)增加了关于映射的描述 – Francesco 2011-03-26 15:47:31

+0

@Ladislav:您有递归意义,即每个国家都可以有几个NationAlly(s)。每个国家在国家领域都有一个国家,而这个国家又可以有几个国家。在这种情况下,将创建整个层次结构组织或地图。地图的边界当然是有限的(最后是没有产生新分支的“叶子”,即没有盟友的国家)或无限(国家都彼此相互关联) – Francesco 2011-03-26 16:08:55

回答

2

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

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

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

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

+0

好。问题通过使用方法#1解决。方法#2看起来非常有趣:如果我理解正确,上下文将在我访问它们时将对象加载到内存中?这意味着,当我“导航地图”到该属性时,toNation属性将自动检索数据库值? – Francesco 2011-03-26 16:52:03

+0

是的,它是数据库中select语句的惰性执行。 – 2011-03-26 17:18:28

+0

它就像一个魅力!大!谢谢! – Francesco 2011-03-26 18:29:17