如何避免在EF6中重新插入父实体 - 处理多对多的关系?

时间:2016-04-06 10:48:56

标签: entity-framework ado.net

我是EF6的新手,面临以下问题:

如果我通过db.Modelclass.Add(model)-method添加我的模型并将更改保存到db中,将在Tours和ToursEmployees表中创建新的实体,就像它应该为模型一样,也可以在我的父表中创建雇员。最后一个是我在下面的代码中的用法。

我已经读过这篇关于https://msdn.microsoft.com/en-us/magazine/dn166926.aspx问题的文章,但在我的情况下,我不知道该怎么做,因为我处理的是多对多的问题。我首先使用代码并通过虚拟导航属性在模型中标记artibutes,因此框架为我创建了一个连接表。

对于这种关系使用框架的正确方法是什么,可能为连接表创建模型然后使用文章中描述的FK?

    public ActionResult Create(TourViewModel tourVM) {


        if (ModelState.IsValid) {                

            Tour tour = new Tour() {
                Tourname = tourVM.Tourname,
                Tourdate = tourVM.Tourdate,
                VehicleId = tourVM.VehicleId
                ,Employees = new List<Employee>()
            };

            for (var i = 0; i < tourVM.Employees.Count; i++)
                if (tourVM.Employees[i].Assigned)
                    tour.Employees.Add(
                        new Employee() { EmployeeId = tourVM.Employees[i].EmployeeId }
                    );                

            db.Tours.Add(tour);                
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        return View(tourVM);
    }

1 个答案:

答案 0 :(得分:1)

我相信这种情况正在发生,因为您将员工添加到未绑定到数据上下文的列表中。执行类似下面的操作应该可以正常地将它们绑定到数据上下文对象。

public ActionResult Create(TourViewModel tourVM) {


    if (ModelState.IsValid) {                

        Tour tour = new Tour() {
            Tourname = tourVM.Tourname,
            Tourdate = tourVM.Tourdate,
            VehicleId = tourVM.VehicleId,
            Employees = new List<Employee>()
        };

        var IDs = tourVM.Employees.Where(e => e.Assigned).Select(e => e.EmployeeId);
        var Employees = db.Employees.Where(e => IDs.Contains(e.EmployeeId)).ToList();

        tour.Employees.AddRange(Employees);              

        db.Tours.Add(tour);                
        db.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(tourVM);
}