0

我有一个类:

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 对象时,它具有由用户输入的 ID 的 Manager 对象。但是,对于该对象,其他详细信息(例如名称)为空,其中具有该 userId 的员工存在于数据库中。在数据库中插入员工记录时,应用程序正在插入两条记录(一条是用户输入的员工姓名,另一条是用户为该员工提供的经理 ID。对于发送,名称保存为空)。为什么要插入两条记录?

4

1 回答 1

1

如果您使用 Subobject 创建一个新 Employee 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已经存在)。

于 2013-09-12T06:00:41.293 回答