当我尝试插入具有Employee类型的Manager的Employee对象时,为什么要插入两条记录?

时间:2013-09-12 05:45:09

标签: c# asp.net-mvc-4 entity-framework-5

我有一个课程:

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)。为什么要插入两条记录?

1 个答案:

答案 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已存在)。