【问题标题】:An entity object cannot be referenced by multiple instances of IEntityChangeTracker error when trying to save changes to multiple types of entities尝试将更改保存到多种类型的实体时,IEntityChangeTracker 错误的多个实例无法引用实体对象
【发布时间】:2014-10-29 05:11:12
【问题描述】:

我有一个控制器操作,我试图在数据库中创建一个FantasyTeam 类型的新对象,并修改一个现有的用户类型的对象。但是,当调用该操作时,我收到了 System.InvalidOperationException 异常,并解释为:

一个实体对象不能被多个实例引用 IEntityChangeTracker。

我的代码如下。

public ActionResult Create([Bind(Include="ID,FantasyTeamName")] FantasyTeam fantasyteam)
    {
        if (ModelState.IsValid)
        {
            var CurrentUser = UserManager.FindById(User.Identity.GetUserId());
            fantasyteam.OwnerID = CurrentUser.Id;
            CurrentUser.HasTeam = true;

            db.FantasyTeams.Add(fantasyteam);
            db.Entry(CurrentUser).State = EntityState.Modified;
            db.SaveChanges();

            return RedirectToAction("Dashboard", "Application");
        }

        return View(fantasyteam);
    }

控制器操作将新的FantasyTeam 对象作为参数从用户选择团队详细信息的视图中获取。然后我找到当前登录的用户并将团队的OwnerID 设置为与所有者的UserID 匹配,作为我的外键。然后我将新的FantasyTeam 添加到数据库并修改数据库中的用户记录,将布尔值HasTeam 更改为true。 新团队的添加本身就可以正常工作...一旦我尝试修改 User 对象,我也遇到了异常。

我在 StackOverflow 上搜索过这个异常,发现了很多相关的问题,但是我找不到将其他解决方案应用于我的问题的方法。在某些情况下,问题是开发人员使用了两个单独的数据上下文,而他们本应该只使用一个,但我认为这不适用于我这里。

有人可以提供关于这里可能出了什么问题的见解吗?

谢谢!

【问题讨论】:

  • 确保db 和UserManager 使用的内部上下文是(使用)相同的上下文。
  • 原来如此——我没有意识到 UserManager 使用的上下文与“db”项使用的上下文不同。谢谢!
  • 有人能指点我一篇解释([Bind(Include="ID,FantasyTeamName")] FantasyTeam fantasyteam) 语法的文章吗?我以前没见过,但假设它与自定义绑定有关。
  • 在本教程页面的中间位置:asp.net/mvc/overview/getting-started/introduction/…
  • 当我被告知要查看入门教程时,我总是担心 :) 谢谢,我会看看。

标签: asp.net-mvc entity-framework


【解决方案1】:

根据Linq to SQL DataContext Lifetime Management的说法,问题的主要原因来自以下原因。

Linq to SQL 使用DataContext 来管理它对数据库的访问以及跟踪对从数据库中检索到的实体所做的更改。 Linq to SQL 有一种持久的方法来通过这个数据上下文管理它与数据库的“连接”,它基本上假设您使用单个DataContext 来进行所有与数据相关的访问。这并不意味着它与数据库建立持久连接,而是意味着DataContext 实例维护有关活动结果集的状态,如果更改跟踪是默认设置,这一点尤其重要。

【讨论】:

    【解决方案2】:

    haim770 发表的评论就是答案——我没有意识到 UserManager 对象使用的上下文与 db 对象使用的上下文不同。一旦我将 UserManager 对象更改为使用与 db 相同的上下文,我的代码就会按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多