我正在尝试保存与 City 相关的员工详细信息。但是每次我尝试保存我的联系人时,我都会收到异常 “ADO.Net Entity Framework An entity object cannot be referenced by multiple instances of IEntityChangeTracker”
我已经阅读了很多帖子,但仍然不知道该怎么做......我的保存按钮点击代码如下所示
protected void Button1_Click(object sender, EventArgs e) { EmployeeService es = new EmployeeService(); CityService cs = new CityService(); DateTime dt = new DateTime(2008, 12, 12); Payroll.Entities.Employee e1 = new Payroll.Entities.Employee(); Payroll.Entities.City city1 = cs.SelectCity(Convert.ToInt64(cmbCity.SelectedItem.Value)); e1.Name = "Archana"; e1.Title = "aaaa"; e1.BirthDate = dt; e1.Gender = "F"; e1.HireDate = dt; e1.MaritalStatus = "M"; e1.City = city1; es.AddEmpoyee(e1,city1); }
和 员工服务代码
public string AddEmpoyee(Payroll.Entities.Employee e1, Payroll.Entities.City c1) { Payroll_DAO1 payrollDAO = new Payroll_DAO1(); payrollDAO.AddToEmployee(e1); //Here I am getting Error.. payrollDAO.SaveChanges(); return "SUCCESS"; }
因为这两行…
EmployeeService es = new EmployeeService(); CityService cs = new CityService();
…不要在构造函数中使用参数,我猜你在类中创建了一个上下文。当你加载city1…
city1
Payroll.Entities.City city1 = cs.SelectCity(...);
…您将 附加city1到CityService. 稍后,您添加 acity1作为对 new 的 引用,Employee e1并在. 结果,您附加了两个不同的上下文,这就是异常所抱怨的。e1 city1EmployeeService``city1
CityService
Employee
e1
EmployeeService``city1
您可以通过在服务类之外创建上下文并在两个服务中注入和使用它来解决此问题:
EmployeeService es = new EmployeeService(context); CityService cs = new CityService(context); // same context instance
您的服务类看起来有点像只负责单一实体类型的存储库。在这种情况下,当您为服务使用单独的上下文时,一旦涉及实体之间的关系,您总是会遇到麻烦。
您还可以创建一个服务,该服务负责一组密切相关的实体,例如EmployeeCityService(具有单个上下文),并将您Button1_Click方法中的整个操作委托给该服务的方法。
EmployeeCityService
Button1_Click