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 中的多条记录? [复制]