1

假设我声明了三个实体:

产品

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public int StoreId { get; set; }
    public Store Store { get; set; }

    public List<Category> Categories { get; set; }
}

店铺

public class Store
{
    public int Id { get; set; }
    public string Name { get; set; }

    public List<Product> Products { get; set; }
}

类别

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }

    public List<Product> Products { get; set; }
}

和之间是一对多的关系,Store和之间Product是多对多的关系。ProductCategory

我正在尝试创建一个新的Product. 在控制器中,我声明:

public ViewResult Create()
{
    ViewBag.StoreId = new SelectList(db.Stores, "Id", "Name");
    return View();
}

[HttpPost]
public ViewResult Create(Product product)
{
    db.Products.Add(product);
    db.SaveChanges();
    return RedirectToAction("Index");
}

然后在视图中,我只需添加以下内容:

@Html.DropDownList("StoreId")

并且所有商店的下拉菜单都会正确地向用户显示。在 POST 创建时,Entity Framework 足够聪明,可以Product.StoreId在保存产品时忽略它,而是使用它将产品与数据库中的现有商店相关联。这一切都非常有效,而且它的简单程度几乎是神奇的。

我的问题是,是否也可以对多对多关系应用相同的开箱即用行为?我尝试创建一个新Product.CategoryIds列表,然后使用相同的模式:

控制器

ViewBag.CategoryIds = new SelectList(db.Categories, "Id", "Name");

看法

@Html.ListBox("CategoryIds")

这将在多选列表框中正确显示类别。但是,当我这次保存产品时,类别不会自动与产品关联,并且产品最终没有任何类别。

有谁知道如何使它正常工作?

4

0 回答 0