开发者

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);
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜