一尘不染

IEntityChangeTracker的多个实例不能引用实体对象。在实体框架4.1中向实体添加相关对象时

c#

我正在尝试保存“员工”详细信息,其中包含“城市”的引用。但是每次尝试保存我的联系人时,都会得到验证 “ ADO.Net Entity
Framework一个实体对象不能被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";
        }

阅读 321

收藏
2020-05-19

共1个答案

一尘不染

因为这两行…

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

…不要在构造函数中使用参数,我想您在类中创建了上下文。当您加载city1

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

…您将附加city1到中的上下文CityService。稍后,您将添加city1对新内容的引用,Employee
e1并在中添加对上下文的e1 引用city1EmployeeService。结果,您已city1附加了异常所抱怨的两个不同的上下文。

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

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

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

您还可以创建一个服务,该服务负责一组紧密相关的实体,例如一个EmployeeCityService(具有单个上下文),并将方法中的整个操作委派Button1_Click给该服务的方法。

2020-05-19