【问题标题】:Calling Attach and Add supplying the same object as parameter调用 Attach 和 Add 提供相同的对象作为参数
【发布时间】:2012-07-31 13:37:55
【问题描述】:

我在一些类型A、B、C和X之间有如下关系:

A->B->X
|->C->X
|->X

现在假设我想向数据库中添加一个新的 A 并将其与 B、C 和 X 的现有实例相关联。

我正在做的是:

using (Context context = new Context())
{
  context.As.Attach(A);
  context.As.Add(A);
  context.SaveChanges();
}

它似乎有效,但我不确定,因为 Attach 通常用于附加现有实例。

此替代方法不起作用:

using (Context context = new Context())
{
  context.Bs.Attach(A.B);
  context.Cs.Attach(A.C);
  context.As.Add(A);
  context.SaveChanges();
}

因为在这种情况下 X 被附加了两次(A.B.X 和 A.C.X)并且实体框架抛出异常:

System.InvalidOperationException: 
An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key.

使用我的解决方案有意义还是有更好的方法来做到这一点?

【问题讨论】:

    标签: c# sql-server entity-framework entity-framework-4


    【解决方案1】:

    是的,您的解决方案很有意义 - 您已附加整个图表并将 A 更改为 Added 状态。也可以改写为:

    using (Context context = new Context())
    {
      context.As.Attach(A);
      context.Entry(A).State = EntityState.Added;
      context.SaveChanges();
    }
    

    在一些复杂的场景中,以相反的顺序执行此操作也很有用 - 添加所有项目并更改所有现有项目的状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2017-02-11
      • 2011-04-06
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2013-11-29
      相关资源
      最近更新 更多