使用“提交”按钮将项目添加到数据库

时间:2015-09-11 15:17:01

标签: asp.net-mvc-5

我还是一名学生,管理数据库的经验很少(几乎没有)。所以我想要弄明白的是我有"粉丝"谁从餐馆页面的菜单中选择菜单项(使用复选框和提交按钮)。我将模型配置为关注者在其表中有一个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); 
            }

        }

    }

我是朝着正确的方向前进吗?任何人都可以发布伪代码来引导我走向正确的方向吗?

1 个答案:

答案 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));