我是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);
}
答案 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);
}