gpt4 book ai didi

c# - Entity Framework 无效操作异常 "An entity object cannot be referenced by multiple instances of IEntityChangeTracker"

转载 作者:太空狗 更新时间:2023-10-30 00:24:54 24 4
gpt4 key购买 nike

我在 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; }
}

更新响应的相关代码如下

/* 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();

上面的代码很简单;我首先更新现有记录并将其 IsDeleted 设置为 true,然后添加新记录,在此特定示例中,首先更新带有 QuestionId == "1.1.1"的响应记录,然后更新带有 QuestionId == "的新响应记录插入 1.1.1"。如果我注释掉第 16 行并取消注释第 17 行,那么一切正常,但是当代码如上所示执行时,我得到一个“无效操作异常”“一个实体对象不能被 IEntityChangeTracker 的多个实例引用”。用户存在于用户表并按原样检索

var user = _db.Users.FirstOrDefault(r => r.UserName.Equals("someUserName@someDomain.com"));

我在 stackoverflow 上查看了一些相关问题 herehere ,虽然解决方法有效,但我的问题是这肯定是 EF6 本身的错误。我不必为 ID 而烦恼,应该能够按照上面的第 16 行简单地分配一个对象,这就是 ORM 的全部目的。

而且,作为一个推论,如果这是一个错误,那么我是否应该始终使用第 17 行中的代码?

最佳答案

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

关于c# - Entity Framework 无效操作异常 "An entity object cannot be referenced by multiple instances of IEntityChangeTracker",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20775079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com