Linq复制/复制整个记录

时间:2014-03-31 15:32:39

标签: c# linq linq-to-entities

我正在使用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可能处于不一致状态。参考   发生完整性约束声音。该属性值   定义refrential约束在principal之间不一致   和关系中的依赖对象。

1 个答案:

答案 0 :(得分:0)

使用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()

的讨论