获取完整地址层次结构(延迟加载问题)

时间:2011-07-17 14:06:00

标签: entity-framework entity-framework-4.1 lazy-loading ef-code-first

我正在使用Entity Framework 4.1 - Code First。我按如下方式存储用户的地址:

国家/地区 - >区 - >城市 - > - >面积 - >地址

这仅适用于我所在国家/地区的地址,我提供该国家/地区的所有可用地区,城市和地区,以便用户可以选择。然后他填写了存储在地址表中的地址详细信息。

为了更清楚,请看看以下内容:

public class Address
{
    public int Id { get; set; }
    public string Name { get; set; }
    [MaxLength(500)]
    public string Details { get; set; }
    public bool IsDefaultAddress { get; set; }
    public string CountryName { get; set; }
    public Area Area { get; set; }
    public virtual User User { get; set; }
}

public class Area
{
    public int Id { get; set; }
    public string GoogleName { get; set; }
    public string FamiliarName { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
    public virtual City City { get; set; }

    public string GetName
    {
        get { return FamiliarName ?? GoogleName; }
    }
}

public class City
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual District District { get; set; }
    public virtual ICollection<Area> Areas { get; set; }
}

public class District
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<City> Cities { get; set; }
    public virtual Country Country { get; set; }
}

public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<District> Districts { get; set; }
}

我注意到无论是否使用virtual关键字,都没有任何变化。由于某种原因,Area始终为空。

如何检索地址并使所有其他信息(区域,城市,区域和国家/地区)对象不为空?

1 个答案:

答案 0 :(得分:2)

如果您知道您将需要它们,只需使用预先加载:

var address = context.Address.Include(a => a.Area.City.District.Country).Where(...);

如果在标记Area virtual时延迟加载不起作用,则其他错误。