实体对象不能被IEntityChangeTracker的多个实例引用。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我正在努力保存员工的详细信息,其中有与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();

不要在构造函数中使用参数,是在类中创建上下文的。

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

你把city1的上下文CityService。稍后,将添加一个city1作为对新事物的参考Employeee1加上e1包括对city1的上下文EmployeeService结果你有city1附加在两个不同的上下文中,这就是异常所抱怨的。

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

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

服务类看起来有点像存储库,它只负责一个实体类型。在这种情况下,当为服务使用单独的上下文时,一旦涉及到实体之间的关系,总是会遇到麻烦。

还可以创建一个服务,该服务负责一组密切相关的实体,如EmployeeCityService(其中只有一个上下文),并将整个操作委托给Button1_Click方法转换为此服务的方法。

用户回答回答于

复制的步骤可以简化为:

var contextOne = new EntityContext();
var contextTwo = new EntityContext();

var user = contexOne.Users.FirstOrDefault();

var group = new Group();
group.User = user;

contextTwo.Groups.Add(group);
contextTwo.SaveChanges();

代码没有错误:

var context = new EntityContext();

var user = context.Users.FirstOrDefault();

var group = new Group();
group.User = user; // Be careful when you set entity properties. 
// Be sure that all objects came from the same context

context.Groups.Add(group);
context.SaveChanges();

扫码关注云+社区