实体框架的无效操作异常"实体对象不能被IEntityChangeTracker的多个实例引用"

usr*_*526 4 c# entity-framework

我遇到一个相当复杂的实体框架6错误"的实体对象不能被IEntityChangeTracker的多个实例引用",虽然它是很容易通过实现一个简单的解决方法来解决这个问题,关键是,原来的实现应该工作原样.这是相关课程的外观

public class Response
{
    public int Id { get; set; }

    public string QuestionId { get; set; } 
//foreign key
    public int UserId { get; set; }
    public virtual User User { get; set; }

    public bool IsDeleted { get; set; }
}

public class User
{
    public int Id { get; set; }

    public string UserName {get; set;}
    public virtual List<Response> Responses { get; set; }

    public bool IsDeleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并且,更新响应的相关代码如下

/* 1 */ using (var db = new SomeContext())
/* 2 */ {
/* 3 */       var existingResponses = userResponses.Select(userResponse =>
/* 3 */                db.Responses.FirstOrDefault(
/* 3 */                r => r.QuestionId.Equals("1.1.1") 
/* 3 */                && r.User.Id.Equals(user.Id) && !r.IsDeleted))
/* 3 */                .Where(existingResponse => existingResponse != null).ToList();
/* 4 */       if (existingResponses.Any())
/* 5 */       {
/* 6 */            foreach (var response in existingResponses)
/* 7 */            {
/* 8 */                 response.IsDeleted = true;
/* 9 */            }
/* 10 */       }

/* 11 */     var newResponses = new List<Response>()
/* 12 */     {
/* 13 */         new Response()
/* 14 */         {
/* 15 */            QuestionId = "1.1.1",
/* 16 */            User = user,
/* 17 */            //UserId = user.Id,
/* 18 */          }
/* 19 */     };

/* 20 */     newResponses.ForEach(r => db.Responses.Add(r));

/* 21 */      db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

上面的代码很简单; 我第一次更新现有的记录,并设置其对请将isDeleted真实,然后添加新的结果,与QuestionId这个具体的例子响应记录=="1.1.1"首次更新,然后一个新的应对纪录QuestionId ==" 1.1.1"已插入.如果我注释掉线16并取消线17,然后一切运作良好,但如上图所示,我得到一个"无效操作异常'的实体对象不能被IEntityChangeTracker的多个实例引用的那一刻代码被执行’,用户在存在用户表并按原样检索

var user = _db.Users.FirstOrDefault(r => r.UserName.Equals("someUserName@someDomain.com"));
Run Code Online (Sandbox Code Playgroud)

我已经在这里这里看了一些关于stackoverflow的相关问题,虽然我的问题是工作,但肯定这是EF6本身的一个错误.我不应该打扰Ids,并且应该能够简单地按照上面第16行分配一个对象,这就是ORM的全部目的.

并且,如果这是一个错误,作为一个必然结果,那么我应该总是采取第17行使用代码的路线吗?

Ser*_*nov 9

每个实体都有DBContext的链接,用于创建它.并且来自一个DBContext的实体不能与另一个DBContext一起使用,因此您需要将其与原始DBContext分离并附加到新的DBContext,或使用相同的DBContext.