我收到的异常是 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 :(得分:1)
你已将其标记为EF4.1(我希望代码优先和dbcontext),但它看起来像EntityObject的副作用(edmx,objectcontext,VS2008和VS2010中的默认代码gen)。
在这种情况下,如果您有一个实体(派生自EntityObject)并且在没有首先分离实体的情况下处置其上下文,则实体实例仍然具有该上下文的工件。因此,当您尝试将其附加到另一个上下文时,它会给出此消息。如果您不使用POCO,那么EF 3.5和EF4会出现问题。我很长时间没有和它搏斗,但我记得那个刺痛。 :)
答案 1 :(得分:1)
问题来自您的Asset对象,当您从其他方法获取它时,您需要在将其添加到此新上下文之前将其从该上下文中显式分离。正如Julie所提到的,实体实例将带有它的上下文,但是问题不是你创建的AssigneeModel
,而是你检索到的someExistingAsset
。