EF6 / MVC 5:如何将多对多解析器实体列表绑定到创建视图中的对象?

时间:2015-04-28 09:12:08

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

我有三个表:玩家,游戏和PlayerGames(联结表)。我有一个与玩家一起创建游戏的工作解决方案,但是我必须直接从Request获取PlayerIds,然后根据需要创建尽可能多的PlayerGames,然后将它们添加到游戏对象中。 我现在拥有的:

创建方法:

        public ActionResult Create([Bind(Include = "Id,LocationId,Date")] Game game)
    {

        if (ModelState.IsValid)
        {
            int[] ids = Request["PlayerId"].Split(',').Select(Int32.Parse).ToArray(); // fetching the Ids from the form
            int lastGameId = !db.Games.Any() ? 0 : db.Games.ToList().Last().Id; // I calculate the next id so I can instantiate the Playergame objects
            game.PlayerGames = new List<PlayerGame>();
            foreach (int t in ids)
                game.PlayerGames.Add(new PlayerGame { GameId = lastGameId + 1, PlayerId = t });


            //Save
        }

        //Redirect
    }

观点的相关部分:

 @for (int i = 0; i < 6; i++)
    {
        <div class="form-group">
            @Html.LabelFor(model => model.PlayerGames.First().Player, "PlayerId", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("PlayerId", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.PlayerGames.First().Player, "", new { @class = "text-danger" })
            </div>
        </div>
    }

我想更好地使用实体框架,我觉得我通过这样的解决方案解决方案浪费了很多潜力。非常感谢你的时间。

1 个答案:

答案 0 :(得分:1)

对你的工作提出质疑以及它是否可以做得更好是好的,但最终没有正确的方式来做到这一点。

然而,由于这属于.NET保护伞,我想说一个好的起点是official tutorials。我喜欢他们为你正在进行的多对多程序所给出的例子,并且之前已经将它作为一个起点用于自我,后来它被改编成更通用的东西。选定的ID应该保存在视图模型中,如示例中所示。我们来看看它:

private void UpdateInstructorCourses(string[] selectedCourses, Instructor 

instructorToUpdate)
{
   if (selectedCourses == null)
   {
      instructorToUpdate.Courses = new List<Course>();
      return;
   }

   var selectedCoursesHS = new HashSet<string>(selectedCourses);
   var instructorCourses = new HashSet<int>
       (instructorToUpdate.Courses.Select(c => c.CourseID));
   foreach (var course in db.Courses)
   {
      if (selectedCoursesHS.Contains(course.CourseID.ToString()))
      {
         if (!instructorCourses.Contains(course.CourseID))
         {
            instructorToUpdate.Courses.Add(course);
         }
      }
      else
      {
         if (instructorCourses.Contains(course.CourseID))
         {
            instructorToUpdate.Courses.Remove(course);
         }
      }
   }
}

在此示例中,讲师是视图正在更新的主要实体,并且复选框列表用于填充属于此讲师的课程。将它更改为通用类型方法会非常容易,因此您可以将它用于所有实体类型 - 这可能会改善您已经获得的内容吗?