"cannot attach an entity that already exists" exception when I adding new objects into a collection

Dec 19, 2011 at 9:09 PM

Hi.

I adding new objects into a collection inner a root object retrieved from my database.

-----------------------------------------

MyRootObject root_object = GetRootObject(withdetailsitems);
root_object.SetAsChangeTrackingRoot();

...

newchild = new ...
root_object.Details[0].ChildObjects.Add(newchild); //Details is a collection inner my root

-----------------------------------------------

When I want to save all, I'd like that newchild been saved in the database

void SaveData(MyRootObject root_object){
  //create my new datacontext instance
  root_object.SynchroniseWithDataContext(db, false);
  db.SubmitChanges();
}

I got an exception in SynchroniseWithDataContext "cannot attach an entity that already exists". It's trying to attach Details[0] object twice. Details[0] have EntityState.Original.

 

Help me please. Tell me what i am doing bad.

Thanks

Dec 19, 2011 at 10:22 PM

I had added a validation in LINQEntityBase.cs source code

in SynchroniseWithDataContext method when an entity have the EntityState.Original state

if(entity.LINQEntityState == EntityState.Original)
{
  if(targetDataContext.GetTable(entity.GetEntityType()).GetOriginalEntityState(entity) == null) //doesn't exist in datacontext
  {
     targetDataContext.GetTable(entity.GetEntityType()).Attach(entity, false);
  }
}

I taked this solution from http://stackoverflow.com/questions/6493737/how-do-i-check-whether-a-linq-to-sql-object-is-already-attached-to-a-datacontext

Please tell me if this is the best solution.

Thanks