System.InvalidOperationException: Cannot attach an entity that already exists
I'm attempting to attach to an object that I've previously detached from. My detach operation is as follows:
partial class Organization : IDetachable
{
#region IDetachable Members
public void Detach()
{
if (IsAttached)
{
PropertyChanged = null;
PropertyChanging = null;
// Detach children -- administrators first.
foreach (var administrator in Administrators)
{
// Detach all of our administrators.
if (administrator.IsAttached)
{
administrator.Detach();
}
}
// now detach users.
foreach (var user in Users)
{
if (user.IsAttached)
{
user.Detach();
}
}
}
}
#endregion
}
Note that there are two children to this type, Organization: Administrators and Users. When I load the Organization I detach from all of them.
In my scenario I'm trying to create a new Administrator. Here is the code from my AdministratorRepository:
public void Save(Administrator administrator)
{
if (!DataContext.Administrators.Contains(administrator))
{
Log.Debug("This is a new administrator.");
administrator.Id = Guid.NewGuid();
administrator.CreatedDate = DateTime.Now;
administrator.Disabled = false;
DataContext.Organizations.Attach(administrator.Organization);
DataContext.Administrators.InsertOnSubmit(administrator);
}
else
{
// Attach to our data context.
DataContext.Administrators.Attach(administrator);
}
DataContext.SubmitChanges();
// Now that we're done...
administrator.Detach();
}
I'm currently getting an exception when trying to attach to an organization (DataContext.Organizations.Attach(administrator.Organization)). I've verified that
- The Organization is valid and detached (i.e. it's event handlers are null)
- There is only one Administrator in the list of administrators (the administrator that I'm currently trying to save).
As I write this, I'm wondering if it actually has to do with a sort of circular de开发者_如何学Pythonpendency -- the Administrator in question has a primary key (i.e. I set ID before I call attach) and the data context is basically seeing the Administrator via the Organization's children?
If that's the case, what is the best way to deal with these parent -> child relationships in LINQ to SQL?
Did you check that the entire data context does not yet contain that particular organization? I think you should check it like that:
if (!DataContext.Organizations.Contains(administrator.Organization))
{
DataContext.Organizations.Attach(administrator.Organization);
}
精彩评论