我有一个课程:
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Employee Manager { get; set; }
public virtual Department Deptartment { get; set; }
}
public class Department
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Employee> Employees { get; set; }
}
在控制器中创建新员工的代码:此代码在DB中插入两条记录。
[HttpPost]
public ActionResult Create(Employee employee)
{
if (ModelState.IsValid)
{
db.Employees.Add(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(employee);
}
我正在提供MVC4视图,用于创建新员工,用户输入员工姓名和ManagerId。当我获得发布的Employee对象时,它具有Manager对象,用户输入了Id。但是,对于该对象,其他详细信息(如Name)为null,其中具有该userId的Employee存在于数据库中。在db中插入Employee记录时,应用程序插入两条记录(一条用于用户输入的员工姓名,另一条记录用户为该员工提供的管理员ID。对于send,名称保存为null)。为什么要插入两条记录?
答案 0 :(得分:1)
如果您使用子对象Employee Manager
创建新员工,则必须重新加载该对象Employee
,否则您将无法在数据库中获取Manager的属性。仅仅添加ID是不够的。
例如,你可以执行
public ActionResult Create(Employee employee)
{
if (ModelState.IsValid)
{
employee.Manager = db.Employees.Find(employee.Manager.Id) // load Manager properties
db.Employees.Add(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(employee);
}
所以这里发生的事情如下:在发布新的Manager
对象之前,使用正确的属性重新加载Employee
对象。因此,实体框架知道实体已存在并且不为其创建新对象(如果Id
已存在)。