如何在EmployeeCourse表

时间:2016-09-25 00:58:08

标签: asp.net-mvc linq-to-sql linq-to-entities entity-framework-5

我需要什么

我需要在EmployeeCourse表中保存课程的更改

从EmployeeCourse表中删除员工的所有课程

然后在更改后添加课程

问题

在删除后添加课程更改时我在保存更改()函数中出现错误

{“更新条目时出错。

INSERT语句与FOREIGN KEY约束冲突

\ “FK_EmployeeCourse_Course \”。冲突发生在数据库\“mycourse \”,

table \“dbo.Course \”,列'Id'。\ r \ n语句已被终止。“}

在提交按钮下编辑[httppost]

public ActionResult Edit(EditEmployeeVm model)
        {
var emp = db.Employees.FirstOrDefault(f => f.Id == model.Id);
// remove all courses
                foreach (EmployeeCourse eec in emp.EmployeeCourses.ToList())
                {
                    var ec = db.EmployeeCourses.Find(eec.Id);
                    db.EmployeeCourses.Remove(ec);
                }
// add courses again
                foreach (var couseid in model.CourseIds)
                {
                    db.EmployeeCourses.Add(new EmployeeCourse { CourseId = couseid, EmployeeId = emp.Id });

                }
                db.SaveChanges();
}

调试结果

debug add as image in

add courses error

详情

两个表之间的关系一对多

EmployeeCourse

Id(主键)CourseId(forign键)EmployeeId(forign键)

数据库中的课程表

Id(pk)CourseName

I using following view model for edit to get CourseIds 

@model StudentCourses.Models.EditEmployeeVm

    $(function () {
        $(document).on("click", ".remove", function (e) {
            e.preventDefault();
            $(this).closest(".course-item").remove();

        });
        $('#AvailableCourses').change(function () {
            var val = $(this).val();
            var text = $("#AvailableCourses option:selected").text();
            var existingCourses = $("input[name='CourseIds']")
                .map(function () { return this.value; }).get();

            if (existingCourses.indexOf(val) === -1) {

                var newItem = $("<div/>").addClass("course-item")
          .append(text + ' <a href="#" class="remove" data-id="' + val + '">Remove </a>');
                newItem.append('<input type="text" name="CourseIds" value="' + val + '" />');

                $("#items").append(newItem);
            }
        });
    });
</script>

在编辑视图中从数据库中检索课程我使用了以下代码

<div>
    @using (Html.BeginForm())
    {

        @Html.HiddenFor(g => g.Id)
        @Html.LabelFor(f => f.Name)
        @Html.DropDownList("AvailableCourses", Model.Courses, "Select")
        <h4>Existing courses</h4>
        <div id="items"></div>
        foreach (var c in Model.ExistingCourses)
        {
            <div class="course-item">
                @c.Name <a href="#" class="remove" data-id="@c.Id">Remove </a>
                <input type="text" name="CourseIds" value="@c.Id" />
            </div>
        }

    }
</div>

用于此的模型如下

    public class EditEmployeeVm
    {
        public int Id { set; get; }
        public List<SelectListItem> Courses { get; set; }
        public int[] CourseIds { set; get; }
        public List<CourseVm> ExistingCourses { set; get; }
    }
    public class CourseVm
    {
        public int Id { set; get; }
        public string Name { set; get; }
    }
}

更新

public ActionResult Edit(int id)
        {
            var vm = new EditEmployeeVm { Id = id };
            var emp = db.Employees.FirstOrDefault(f => f.Id == id);
            vm.Name = emp.Name;
            vm.ExistingCourses = db.EmployeeCourses
                                    .Where(g => g.EmployeeId == id)
                                    .Select(f => new CourseVm
                                    {
                                        Id = f.Id,
                                        Name = f.Course.CourseName
                                    }).ToList();
            vm.CourseIds = vm.ExistingCourses.Select(g => g.Id).ToArray();
            vm.Courses = db.Courses.Select(f => new SelectListItem
            {
                Value = f.Id.ToString(),
                Text = f.CourseName
            }).ToList();

            return View(vm);
        }

1 个答案:

答案 0 :(得分:0)

在您的编辑获取操作中,您使用的是CourseVm的错误ID。它应该是课程ID,但您要设置EmployeeCourse记录/实体ID。

这应该解决它。

vm.ExistingCourses = db.EmployeeCourses.Where(g => g.EmployeeId == id)
                                       .Select(f => new CourseVm
                                           {
                                              Id = f.Course.Id,
                                              Name = f.Course.CourseName
                                           }).ToList();