System.InvalidOperationException:无法附加已存在的实体

时间:2010-04-20 01:03:46

标签: c# linq-to-sql

我试图附加到我之前分离过的物体上。我的分离操作如下:

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
}

请注意,此类型有两个子项,即组织:管理员和用户。当我加载组织时,我从所有组织中分离出来。

在我的场景中,我正在尝试创建一个新的管理员。以下是我的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();
}

我在尝试附加到组织时遇到异常(DataContext.Organizations.Attach(administrator.Organization))。我已经验证了

  • 组织有效且分离(即事件处理程序为空)
  • 管理员列表中只有一个管理员(我目前正在尝试保存的管理员)。

在我写这篇文章的时候,我想知道它是否真的与某种循环依赖有关 - 管理员有一个主键(即我在调用attach之前设置了ID),数据上下文基本上是通过组织的孩子看到管理员?

如果是这样的话,处理这些父母的最佳方式是什么?> LINQ to SQL中的子关系?

1 个答案:

答案 0 :(得分:1)

您是否检查过整个数据上下文是否还包含该特定组织? 我想你应该这样检查一下:

if (!DataContext.Organizations.Contains(administrator.Organization))
{
   DataContext.Organizations.Attach(administrator.Organization);
}