2012-08-24 38 views
0

我收到的異常是IEntityChangeTracker的多個實例無法引用實體對象。我的代碼的結構是這樣的...C#實體框架 - 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版

+0

是否Asset = someExistingAsset來自不同的上下文? –

+0

是的,它來自另一種方法的服務調用......但我認爲上下文將被丟棄? – contactmatt

+1

這就是問題 - 您需要將該實體從其他實體中分離出來,然後將其附加到此新的上下文中,或者對所有調用使用相同的上下文 –

回答

1

問題來自您的Asset對象,當您從其他方法獲取該對象時,需要將它從該上下文中明確分離,然後再將其添加到此新上下文中。正如朱莉提到的那樣,實體實例會帶上它的上下文,但是這個圖標並不是你創建的AssigneeModel,而是你檢索到的someExistingAsset

+0

標記爲答案,尤其是因爲你對這個問題的原始評論給了我一個快速的答案/答覆:) – contactmatt

1

您已經標記了這個作爲EF4.1(如我所料代碼首先& dbcontext),但它看起來像EntityObject(edmx,objectcontext,VS2008 & VS2010中的默認代碼gen)的副作用。在這種情況下,如果您有一個實體(派生自EntityObject),並且在不先分離實體的情況下處理其上下文,則實體實例仍然具有該上下文的工件。所以當你試圖將它附加到另一個上下文時,它會給出這個消息。如果您不使用POCO,那麼EF 3.5和EF4會出現問題。我很久沒有和它搏鬥了,但我記得那個刺痛。 :)