System.InvalidOperationException: невозможно присоединить сущность, которая уже существует - PullRequest
3 голосов
/ 20 апреля 2010

Я пытаюсь присоединиться к объекту, от которого я ранее оторвался. Моя операция отсоединения выглядит следующим образом:

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
}

Обратите внимание, что у этого типа есть два дочерних элемента: Организация: Администраторы и Пользователи. Когда я загружаю Организацию, я отсоединяюсь от всех них.

В моем сценарии я пытаюсь создать нового администратора. Вот код из моего репозитория Administrator:

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

В настоящее время я получаю исключение при попытке присоединиться к организации (DataContext.Organizations.Attach (administrator.Organization)). Я подтвердил, что

  • Организация действительна и отделена (то есть ее обработчики событий равны нулю)
  • В списке администраторов есть только один Администратор (администратор, которого я сейчас пытаюсь сохранить).

Когда я пишу это, мне интересно, связано ли это с некой круговой зависимостью - у рассматриваемого администратора есть первичный ключ (т. Е. Я устанавливаю идентификатор перед вызовом присоединения), и контекст данных в основном видеться с Администратором через детей Организации?

Если это так, как лучше всего справиться с этими отношениями родитель -> потомок в LINQ to SQL?

1 Ответ

1 голос
/ 21 марта 2011

Проверяли ли вы, что весь контекст данных еще не содержит эту конкретную организацию? Я думаю, вы должны проверить это так:

if (!DataContext.Organizations.Contains(administrator.Organization))
{
   DataContext.Organizations.Attach(administrator.Organization);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...