【问题标题】:C# Entity Framework - IEntityChangeTracker issueC# 实体框架 - IEntityChangeTracker 问题
【发布时间】:2012-08-20 04:37:24
【问题描述】:

我收到的异常是一个实体对象不能被多个 IEntityChangeTracker 实例引用。我的代码结构是这样的......

我的上下文类如下所示:

    public class MyContext : DbContext, IDataContext
    {
        public MyContext (string connectionString) :
            base(connectionString)
        { 
        }

        public DbSet<AssigneeModel> Assignees { get; set; }
        public DbSet<AssetAssignmentModel> AssetAssignments { get; set; }
 }

public class AssigneeController : Controller
    {
        protected MyContext db = new MyContext(ConnectionString);

[HttpPost]
        public ActionResult Import(SomeObjectType file)
        {
           AssigneeModel assignee = new AssigneeModel();
           assignee.FirstName = "Joe";
           assignee.LastName = "Smith";

           // Assignees have assets, and the relationship is established via an AssetAssignmentModel entity

            AssetAssignmentModel assetAssignmentModel = new AssetAssignmentModel
            {
                Asset = someExistingAsset,
                // Assignee = assignee, // Don't establish relationship here, this object will be added to the assignee collection
             }

           assignee.AssetAssignments.Add(assetAssignmentModel); // Manually add object to establish relationship
           db.Assignees.Add(assignee); // Add the assignee object 
           // Exception occurs when adding the object above
        };
}

EF 4.1 版

【问题讨论】:

  • Asset = someExistingAsset 是否来自不同的上下文?
  • 是的,它来自另一个方法的服务调用......但我认为上下文会被处理掉?
  • 这就是问题所在 - 您需要将该实体与另一个实体分离,然后将其附加到这个新上下文,或者对所有调用使用相同的上下文
  • 我已将评论移至答案,因为我相信这对您有所帮助:)

标签: c# entity-framework entity-framework-4.1


【解决方案1】:

问题出在您的 Asset 对象上,当您从其他方法获取它时,您需要在将其添加到这个新上下文之前显式地将其从该上下文中分离出来。正如 Julie 所提到的,实体实例将携带上下文,但问题不是您创建的 AssigneeModel,而是您检索到的 someExistingAsset

【讨论】:

  • 将此标记为答案,尤其是因为您对该问题的原始评论给了我一个快速的答案/回复:)
【解决方案2】:

您已将其标记为 EF4.1(我期望代码优先和 dbcontext),但它看起来像是 EntityObject(edmx、objectcontext、VS2008 和 VS2010 中的默认代码生成)的副作用。

在这种情况下,如果您有一个实体(从 EntityObject 派生)并且您在没有先分离实体的情况下处置其上下文,则实体实例仍然具有该上下文的工件。因此,当您尝试将其附加到另一个上下文时,它会给出此消息。如果您不使用 POCO,那是 EF 3.5 和 EF4 的问题。我很久没和它搏斗了,但我记得那次刺痛。 :)

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 2013-07-17
    • 2018-03-03
    • 2015-02-24
    • 2011-11-16
    • 1970-01-01
    • 2017-05-06
    • 2013-06-16
    相关资源
    最近更新 更多