EF加载相关数据问题

时间:2013-12-30 11:42:00

标签: c# asp.net-mvc entity-framework

我有两个实体:

public class Album
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual int GenreId { get; set; }
    public virtual int ArtistId { get; set; }
    public virtual string CoverURL { get; set; }
    public virtual int Cost { get; set; }
    public virtual Artist Artist { get; set; }
    public virtual Genre Genre { get; set; }
}

public class Genre
{
    public int Id { get; set; }       
    public string Name { get; set; }
    public virtual IEnumerable<Album> Albums{get;set;}
    public int AlbumCount { get { return Albums.Count(); } }
    public Genre()
    {
        Albums = new List<Album>();
    }
}

这是控制器动作。

public ActionResult Index()
    {
        var genres = db.Genres.ToList();
        return View(genres);
    }

我在流派和专辑之间有一对多的映射(一张专辑只能有一种流派,但一种流派可以属于多个专辑)。当我尝试获取相册详细信息(包括流派导航属性)时,它会给我预期的数据。但是当我尝试显示所有类型时,它总是给我0作为专辑计数。我怀疑是一个有约束力的问题,但我无法找到答案。如果你能帮忙找出问题,我将很高兴。

2 个答案:

答案 0 :(得分:1)

您必须使用ICollection代替IEnumerable作为导航属性:

public virtual ICollection<Album> Albums { get; set; }

(例如,见SO answer

然后,您可以使用Include方法通过Albums获取Genres

db.Genres.Include(genre => genre.Albums)

db.Genres.Include("Albums")

编辑:阅读此SO answer以获取有关集合类型的更多信息。基本上,ICollection继承自IEnumerable,并允许您修改集合(IEnumerable的主要目的是迭代)。

答案 1 :(得分:0)

你试过这个吗?

public ActionResult Index()
{
    var genres = db.Genres.Include(x => x.Albums).ToList();
    return View(genres);
}