在ASP.NET MVC / Entify Framework中创建或更新子模型

时间:2011-08-23 12:33:41

标签: asp.net-mvc entity-framework

我有一个视频模型,其中包含我想要创建的标签集合

public class Video{
  public int Id { get; set; }
  public string Title { get; set; }
  public virtual ICollection<Tag> Tags { get; set; }
  etc.
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Video> Videos { get; set; }
}

我有一个标准生成的控制器操作,如下所示:

  [HttpPost]
  public ActionResult Create(Video video)
  {
        if (ModelState.IsValid)
        {
            db.Videos.Add(video);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }
  }

模型绑定似乎工作正常,我得到一个带有所需值的新视频和一组标签。 (主键,1,7,34等)

但是,使用此方法,新视频不会绑定到现有标记,而是始终创建新视频。

是否存在一种自动方式,如果存在提供的Id的标记,则不会创建新标记,但是只创建与现有标记的关系?

2 个答案:

答案 0 :(得分:0)

我认为你需要通过视频创建页面上的复选框提供供应标签,然后如果用户找不到相关信息,那么他可以通过文本框上的相同名称标签创建一个新标签。这是一个更新复选框的例子我从asp.net mvc网站

获得它
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);
        }
    }
}
}

我认为这是最好的方法,如果您创建了具有相同名称的文本框,则hashset还包含新标记。

这是完整的教程

http://www.asp.net/entity-framework/tutorials/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

答案 1 :(得分:0)

这是我最终做的事情:

 var newtags = new List<Tag>();
        foreach (var tag in video.Tags)
        {
            var t = db.Tags.SingleOrDefault(d => d.Name.ToLower() == tag.Name.ToLower());
            if (t != null)
            {
                newtags.Add(t);
                continue;
            }
            if (!string.IsNullOrWhiteSpace(tag.Name))
            {
                newtags.Add(tag);
            }
        }
 video.Tags = newtags;

这样就可以使用数据库检查标签,如果它们存在,我将现有标签添加到临时列表中,如果不存在,我将新标签添加到临时列表中。

然后将所有标签重新分配为新列表,一些新标签,一些旧标签。

然后创建新标签,并绑定到视频,其他标签仅绑定。

不确定这是否是最佳方式。