C#Entity Framework - IEntityChangeTracker问题

时间:2012-08-24 15:28:28

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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