0

我收到的异常是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
        };
}

英孚版本 4.1

4

2 回答 2

1

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

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

于 2012-08-24T15:50:25.543 回答
1

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

于 2012-08-24T22:12:16.547 回答