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";


 }



时间: 原作者:

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 ( 它有一个单独的上下文) )的服务,并将整个操作委托给这里服务的方法。

原作者:
...