假设我宣布了三个实体:
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
之间存在一对多关系,Product
和Category
之间存在多对多关系。
我正在尝试创建一个新的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创建时,实体框架足够聪明,可以在保存产品时忽略Product.StoreId
,而是使用它将产品与数据库中的现有商店相关联。这一切都非常好,并且几乎是多么神奇。
我的问题是,是否可以对多对多关系应用相同的开箱即用行为?我尝试创建一个新的Product.CategoryIds
列表,然后使用相同的模式:
ViewBag.CategoryIds = new SelectList(db.Categories, "Id", "Name");
@Html.ListBox("CategoryIds")
这将正确显示多选列表框中的类别。但是,当我这次保存产品时,类别不会自动与产品相关联,并且产品最终没有任何类别。
有谁知道如何正常工作?