我将Linq用于一般CRUD操作的实体。最近,我遇到了一个场景问题,我必须在数据库中复制整个记录(在所有相关表中使用不同的主键)。我的数据库结构非常简单。我有一个主表(让我们说A)和其他表(让我们说B,C,D)。主表将表B,C,D的主键保留为外键。

我从数据库中提取了必须重复的记录。然后我

1)使用context.objectStateManager.ChangeObjectState(AObj,EntityState.Added)将其对象状态更改为“添加”

2)使用context.AddToA(AObj)在上下文中添加对象

3)然后我做save​​Changes()

在表A上一切正常,并正确插入了新对象。

如果我对表B,C,D执行相同的步骤,则会出现异常

1)使用context.objectStateManager.ChangeObjectState(AObj.B,EntityState.Added)将其对象状态更改为“已添加” //在这里我访问子表B

2)使用context.AddToA(AObj)在上下文中添加对象

3)然后我做save​​Changes()


  objectContext可能处于不一致状态。参照
  发生完整性约束损坏。该属性值
  定义主体之间的约束条件不一致
  和关系中的从属对象。

最佳答案

使用AsNoTracking()读取对象图,然后只需添加它并保存,不必担心顺序或状态,我用它来在最近的项目中实现SaveAs功能:

        var myGraph = tableA.Where(c => c.Id == id)
            .Include(c => c.childA)
            .Include(c => c.childB)
            .Include(c => c.childC)
            .AsNoTracking()
            .FirstOrDefault();

        if (myGraph != null)
        {
            myGraph.CopiedFromId = id;

            myGraph = Context.Set<TableA>().Add(myGraph);

            Context.SaveChanges();
        }


这是关于AsNoTracking()的讨论

关于c# - Linq复制/复制整个记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22765808/

10-17 02:36