CSharp - C# 实体对象不能由多个IEntityChangeTracker实例引用 在 Entity Framework 4.1中,向实体添加相关对象时

  显示原文与译文双语对照的内容
146 5

我正在保存员工详细信息,该详细信息与城市相关。我的联系人不能被多个实例引用,但我每次尝试保存联系人的时候,都会得到一个 "ADO.Net Entity Framework的异常。

我读过这么多帖子,但仍然没有得到确切的想法应该怎么做- - 。我的保存按钮单击代码如下

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);
 }

Employeeservice代码

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";
 }
时间:原作者:0个回答

51 2

因为这两条线。

EmployeeService es = new EmployeeService();
CityService cs = new CityService();

。不要在构造函数中获取参数,我想你在类中创建了一个上下文。加载 city1 时。

Payroll.Entities.City city1 = cs.SelectCity(...);

。将 city1 附加到 CityService 中的上下文中。稍后添加一个 city1 作为对新 Employeee1的引用,并添加 e1 include将这里引用添加到 EmployeeService 中的上下文 。因此,你将 city1 附加到两个不同的上下文中,这是异常所。

通过在服务类之外创建上下文并在两个服务中注入和使用该上下文,可以解决这里问题:

EmployeeService es = new EmployeeService(context);
CityService cs = new CityService(context);//same context instance

服务类看起来有点像仓库,它们只负责一个实体类型。在这种情况下,当实体与服务使用单独的上下文时,一旦涉及到实体之间的关系,就会。

此外,还可以创建一个负责一组紧密相关实体( 如 EmployeeCityService ( 它有一个单独的上下文) )的服务,并将整个操作委托给这里服务的方法。

原作者:
...