Linq复制/复制整个记录

Posted

技术标签:

【中文标题】Linq复制/复制整个记录【英文标题】:Linq duplicate/copy the whole record 【发布时间】:2014-03-31 15:32:39 【问题描述】:

我正在使用 Linq to 实体进行一般 CRUD 操作。最近,我有一个场景,我必须复制数据库中的整个记录​​(在所有相关表中使用不同的主键)。我的数据库结构非常简单。我有一个主表(比如 A)和其他表(比如 B、C、D)。主表保存表 B、C、D 的主键作为外键。

我从数据库中取出一条我必须复制的记录。然后我

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

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

3) 然后我做 saveChanges()

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

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

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

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

3) 然后我做 saveChanges()

objectContext 可能处于不一致的状态。一个参考 发生完整性约束破坏。属性值 定义了引用约束在主体之间不一致 以及关系中的依赖对象。

【问题讨论】:

您可能想要更改保存顺序,这样就不会创建关键 konstrains 好吧,我还尝试在表中手动插入数据(与我在代码中所做的相同),并且所有内容都插入了任何错误。 linq 出了点问题。 您不需要添加项目,它们已经在上下文中。你只需要改变他们的状态。 好的,我设法解决了这个问题。 @COLDTOLD 你是对的,我改变了订单并且一切正常。 @HonorableChow 谢谢。我正在做你提到的错误。我只是将状态更改为已添加,然后无需执行 AddObject。 【参考方案1】:

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

【讨论】:

以上是关于Linq复制/复制整个记录的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 Linq to Entity 中的多条记录? [复制]

如何使用 LINQ 和 EF 将记录复制到另一个表及其关系

我可以使用 linq 将表加入列表吗? [复制]

假设一个表中有多个列有 1000 条记录,如何在整个表中查找重复记录? [复制]

LINQ 是不是有 Java 等价物? [复制]

LINQ 是不是有 Java 等价物? [复制]