我正在尝试保存员工详细信息,其中引用了City。但是每次我尝试保存我的联系人时,我得到了异常"ADO.Net实体框架一个实体对象不能被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";
}
发布于 2012-04-17 23:35:30
因为这两条线。
EmployeeService es = new EmployeeService();
CityService cs = new CityService();
..。不要在构造函数中带参数,我猜你在类中创建了一个上下文。当您加载city1
时...
Payroll.Entities.City city1 = cs.SelectCity(...);
...you将city1
附加到CityService
中的上下文。稍后,您将添加一个city1
作为对新Employee
e1
的引用,并将包含此对city1
的引用的e1
添加到EmployeeService
的上下文中。因此,您将city1
附加到两个不同的上下文,这就是异常所抱怨的。
您可以通过在服务类之外创建上下文并在两个服务中注入和使用它来修复此问题:
EmployeeService es = new EmployeeService(context);
CityService cs = new CityService(context); // same context instance
您的服务类看起来有点像存储库,它只负责单一的实体类型。在这种情况下,当您为服务使用单独的上下文时,一旦涉及到实体之间的关系,您总是会遇到麻烦。
您还可以创建一个服务,该服务负责一组密切相关的实体,如EmployeeCityService
(只有一个上下文),并将Button1_Click
方法中的整个操作委托给此服务的一个方法。
发布于 2015-01-09 20:32:29
重现的步骤可以简化为:
var contextOne = new EntityContext();
var contextTwo = new EntityContext();
var user = contextOne.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();
只使用一个EntityContext
就可以解决这个问题。有关其他解决方案,请参阅其他答案。
发布于 2014-11-09 10:57:38
这是一个旧线程,但是另一个解决方案,我更喜欢的是,只是更新cityId,而不是将孔模型City分配给Employee……要做到这一点,员工应该如下所示:
public class Employee{
...
public int? CityId; //The ? is for allow City nullable
public virtual City City;
}
那么分配就足够了:
e1.CityId=city1.ID;
https://stackoverflow.com/questions/10191734
复制相似问题