首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >entity对象不能被多个IEntityChangeTracker实例引用。向entity Framework 4.1中的Entity添加相关对象时

entity对象不能被多个IEntityChangeTracker实例引用。向entity Framework 4.1中的Entity添加相关对象时
EN

Stack Overflow用户
提问于 2012-04-17 20:57:31
回答 13查看 192.1K关注 0票数 182

我正在尝试保存员工详细信息,其中引用了City。但是每次我尝试保存我的联系人时,我得到了异常"ADO.Net实体框架一个实体对象不能被IEntityChangeTracker的多个实例引用“

我读了这么多帖子,但还是不知道该怎么做……我的保存按钮点击代码如下所示

代码语言:javascript
复制
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);
    }

员工服务代码

代码语言:javascript
复制
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";
        }
EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2012-04-17 23:35:30

因为这两条线。

代码语言:javascript
复制
EmployeeService es = new EmployeeService();
CityService cs = new CityService();

..。不要在构造函数中带参数,我猜你在类中创建了一个上下文。当您加载city1时...

代码语言:javascript
复制
Payroll.Entities.City city1 = cs.SelectCity(...);

...you将city1附加到CityService中的上下文。稍后,您将添加一个city1作为对新Employee e1的引用,并将包含此对city1的引用的e1添加到EmployeeService的上下文中。因此,您将city1附加到两个不同的上下文,这就是异常所抱怨的。

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

代码语言:javascript
复制
EmployeeService es = new EmployeeService(context);
CityService cs = new CityService(context); // same context instance

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

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

票数 252
EN

Stack Overflow用户

发布于 2015-01-09 20:32:29

重现的步骤可以简化为:

代码语言:javascript
复制
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();

没有错误的代码:

代码语言:javascript
复制
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就可以解决这个问题。有关其他解决方案,请参阅其他答案。

票数 31
EN

Stack Overflow用户

发布于 2014-11-09 10:57:38

这是一个旧线程,但是另一个解决方案,我更喜欢的是,只是更新cityId,而不是将孔模型City分配给Employee……要做到这一点,员工应该如下所示:

代码语言:javascript
复制
public class Employee{
    ...
    public int? CityId; //The ? is for allow City nullable
    public virtual City City;
}

那么分配就足够了:

代码语言:javascript
复制
e1.CityId=city1.ID;
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10191734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档