我还是一名学生,管理数据库的经验很少(几乎没有)。所以我想要弄明白的是我有"粉丝"谁从餐馆页面的菜单中选择菜单项(使用复选框和提交按钮)。我将模型配置为关注者在其表中有一个MenuItem数组的位置,但是我无法正确编码,以便在提交按钮将这些菜单项添加到关注者数组时工作。
这是我到目前为止的行动方法:
public ActionResult AddMenuItems(int MenuItemID)
{
// Need to run through array of MEnuItem ID's and add them to the Followers LIst of MEnuItems
foreach (var menuItem in Model.MenuItems)//Getting an error here because it can't call Model.MenuItems, not sure how to properly get there....
{
Model.MenuItems menuItem = new Model.MenuItems();
menuItem.menuItemID = menuItem.Key;
if (menuItem.key == MenuItemID)
{
Follower.Add(menuItem);
}
}
}
我是朝着正确的方向前进吗?任何人都可以发布伪代码来引导我走向正确的方向吗?
答案 0 :(得分:1)
通常,我会将您推荐给Microsoft's set of Entity Framework tutorials。您似乎并不了解如何正确设置实体/上下文。
接下来,您的代码是矛盾的。您谈到了一系列菜单项ID,但您的操作只需要一个id。如果您确实要发布多个ID,则需要绑定到List<int>
或类似内容,而不是int
。
假设您实际上应该有一个id列表,那么一般来说,您希望使用这些ID来从数据库中选择菜单项,然后将它们添加到包含菜单项的Follower
上的集合中:
db.MenuItems.Where(m => menuItemIds.Contains(m.Id)).ToList()
.ForEach(m => follower.MenuItems.Add(m));
编辑现有选择时,您需要更加小心,因为运行上述代码实际上会使Entity Framework尝试读取现有的菜单项。相反,您首先需要删除已取消选择的项目,然后仅添加新项目。由于这是多对多的,现有项目不需要更新。
// Remove deselected menu items
follower.MenuItems.Where(m => !menuItemIds.Contains(m.Id)).ToList()
.ForEach(m => follower.MenuItems.Remove(m));
// Add newly selected menu items
var existingMenuItemIds = follower.MenuItems.Select(m => m.Id).ToList();
db.MenuItems.Where(m => menuItemIds.Except(existingMenuItemIds).Contains(m.Id)).ToList()
.ForEach(m => follower.MenuItems.Add(m));