gpt4 book ai didi

asp.net-mvc - Entity Framework 多对多关系在添加关系之前添加 "end"项

转载 作者:行者123 更新时间:2023-12-04 06:07:27 26 4
gpt4 key购买 nike

我已经使用常见的学生和类(class)场景建立了一个非常简单的 Entity Framework 数据库第一个项目。

  • 一个学生可以有多门类(class)
  • 一个类(class)可以有很多学生

  • 我已经在数据库中建立了关系,EF 为此创建了一个很好的多对多导航项。

    问题当我向学生添加类(class)时,类(class)会重新添加到类(class)表中,然后将关系添加到数据库中,导致重复类(class)数量不断增加

    这让我发疯,知道我做错了什么吗?

    我的一些代码....

    我在实体生成的上面创建了一个 Partial 类,这样我就可以有一个带有复选框的 EditorTemplate,这将允许用户勾选要添加的类(class)
    public partial class Course
    {
    public bool isSelected { get; set; }
    }

    public partial class Course
    {
    public Course()
    {
    this.Students = new HashSet<Student>();
    }

    public int CourseId { get; set; }
    public string CourseName { get; set; }

    public virtual ICollection<Student> Students { get; set; }
    }

    类(class)的编辑器模板
    @model University.Models.Course

    <div>
    @Html.CheckBoxFor(m => m.isSelected)
    @Html.DisplayFor(m => m.CourseName)


    @Html.HiddenFor(m => m.CourseName)
    @Html.HiddenFor(m =>m.CourseId)
    </div>

    创建学生 View
    @model University.Models.CreateStudentViewModel            
    @using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
    <legend>Student</legend>
    <div class="editor-label">
    @Html.LabelFor(model => model.student.Name)
    </div>
    <div class="editor-field">
    @Html.EditorFor(model => model.student.Name)
    @Html.ValidationMessageFor(model => model.student.Name)
    </div>
    <div>
    @Html.EditorFor(m=>m.courses)
    </div>
    <p>
    <input type="submit" value="Create" />
    </p>
    </fieldset>
    }

    页面的 ViewModel
    public class CreateStudentViewModel
    {
    public Student student { get; set; }
    public ICollection<Course> courses { get; set; }
    }

    Controller
    public ActionResult Create()
    {
    CreateStudentViewModel vm = new CreateStudentViewModel();
    vm.courses = db.Courses.ToList();
    return View(vm);
    }
    [HttpPost]
    public ActionResult Create(CreateStudentViewModel model)
    {
    if (ModelState.IsValid)
    {
    model.student.Courses = model.courses.Where(m => m.isSelected == true).ToList();
    db.Students.Add(model.student);
    db.SaveChanges();
    return RedirectToAction("Index");
    }
    return View(model);
    }

    任何为我指明正确方向的帮助将不胜感激

    最佳答案

    在将学生添加到上下文之前,您必须在发布操作中将所选类(class)附加到上下文。否则 EF 假定整个对象图 - 包括所有类(class)的学生 - 都是新的,必须插入到数据库中。通过附加(=将类(class)置于 Unchanged 状态),您告诉 EF 您不希望将附加类(class)作为新行插入,而只在新学生和现有类(class)之间创建关系:

    [HttpPost]
    public ActionResult Create(CreateStudentViewModel model)
    {
    if (ModelState.IsValid)
    {
    model.student.Courses =
    model.courses.Where(m => m.isSelected == true).ToList();

    foreach (var course in model.student.Courses)
    db.Courses.Attach(course);
    // now each course is in state Unchanged in the context

    db.Students.Add(model.student);
    // model.student is in state Added in the context
    // but the courses still have the state Unchanged.
    // Without the attach-loop above they would be in
    // state Added as well, which will create new courses
    // in the DB after SaveChanges

    db.SaveChanges();

    return RedirectToAction("Index");
    }
    return View(model);
    }

    关于asp.net-mvc - Entity Framework 多对多关系在添加关系之前添加 "end"项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8186580/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com