加入多对多模型以允许在视图中进行迭代

时间:2014-12-06 16:34:12

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

我正在使用这些模型:

public class FList
{
    public int FListID { get; set; }
    public string Title { get; set; }
    public int UserID { get; set; }
    public DateTime Posted { get; set; }
    public virtual User User { get; set; }
    public ICollection<FListItem> Items { get; set; }
}

public class Item
{
    public int ItemID { get; set; }
    public string Name { get; set; }
    public ICollection<FListItem> FLists { get; set; }
}

public class FListItem
{
    public int FListID { get; set; }
    public int ItemID { get; set; }
    public int Score { get; set; }
    public virtual FList FList { get; set; }
    public virtual Item Item { get; set; }
}

public class User
{
    public int UserID { get; set; }
    public string UserName { get; set; }
    public ICollection<FList> FLists { get; set; }
}

使用这个流畅的API,在FListItem上创建一个复合主键。

modelBuilder.Entity<FaveListItem>().HasKey(fi => new { fi.FaveListID, fi.ItemID });

modelBuilder.Entity<FList>()
            .HasMany(f => f.Items)
            .WithRequired(fi => fi.FList)
            .HasForeignKey(fi => fi.FListID);
modelBuilder.Entity<Item>()
            .HasMany(f => f.FLists)
            .WithRequired(fi => fi.Item)
            .HasForeignKey(fi => fi.ItemID);

如果我为FList添加控制器,则会创建以下脚手架

public ActionResult Index()
{
    var fLists = db.FLists.Include(f => f.User);
    return View(fLists.ToList());
}

允许在索引视图上迭代fLists

我需要做的是包含Items,可以为每个fList进行迭代。我无法使用Include,因为Items上没有FList导航属性。

我想我需要在JoinItems fList并使用IEnumerable创建一个viewModel,以允许Items的迭代。

如果上述推理是正确的,请任何人可以提供建议吗?如果是,请协助Join

2 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。如果创建视图模型,则将为Flist viewmodel类中的项指定导航属性。一旦完成,您将无需更改包含,它将自动生效。

你的viewmodel看起来像......

public class FList
{
[Key]
    public int FListID { get; set; }
    public string Title { get; set; }
    public int UserID { get; set; }
    public DateTime Posted { get; set; }
    public virtual User User { get; set; }


    public virtual ICollection<Item> Items { get; set; }

}

public class Item
{
[Key]
    public int ItemID { get; set; }
    public string Name { get; set; }
    public ICollection<FListItem> FLists { get; set; }
}

答案 1 :(得分:1)

您还可以Include项目:

db.FLists.Include(f => f.User)
         .Include(f => f.Items.Select(i => i.Item))

我不知道视图模型的样子,但是FList的项目可以通过

进行迭代
fList.Items.Select(i => i.Item)

顺便说一下,我更喜欢为ICollection<FListItem>个收藏品和#34; FListItem&#34;命名,以免将它们与真实的ItemsFLists混淆分别。