C# Linq复制/复制整个记录
我正在使用Linq to实体进行一般CRUD操作。最近,我有一个场景,我必须复制数据库中的整个记录(在所有相关表中使用不同的主键)。我的数据库结构非常简单。我有一个主表(假设a)和其他表(假设B、C、D)。主表将表B、C、D的主键作为外键保存 我从数据库中取出一条必须复制的记录。然后我 1) 使用context.objectStateManager.ChangeObjectState(AObj,EntityState.Add)将其对象状态更改为“已添加” 2) 使用context.AddToA(AObj)在上下文中添加对象 3) 然后我保存更改() 在表A上一切正常,新对象正确插入 如果我对表B、C、D执行相同的步骤,我会得到一个异常 1) 使用context.objectStateManager.ChangeObjectState(AObj.B,EntityState.Added)将其对象状态更改为“Added”//这里我访问子表B 2) 使用context.AddToA(AObj)在上下文中添加对象 3) 然后我保存更改() objectContext可能处于不一致的状态。参考文献 发生完整性约束错误。属性值 定义主体之间的引用约束不一致 和关系中的从属对象C# Linq复制/复制整个记录,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我正在使用Linq to实体进行一般CRUD操作。最近,我有一个场景,我必须复制数据库中的整个记录(在所有相关表中使用不同的主键)。我的数据库结构非常简单。我有一个主表(假设a)和其他表(假设B、C、D)。主表将表B、C、D的主键作为外键保存 我从数据库中取出一条必须复制的记录。然后我 1) 使用context.objectStateManager.ChangeObjectState(AObj,EntityState.Add)将其对象状态更改为“已添加” 2) 使用context.AddToA(
使用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();
}
var myGraph=tableA.Where(c=>c.Id==Id)
.包括(c=>c.childA)
.包括(c=>c.childB)
.包括(c=>c.childC)
.AsNoTracking()
.FirstOrDefault();
if(myGraph!=null)
{
myGraph.CopiedFromId=id;
myGraph=Context.Set().Add(myGraph);
SaveChanges();
}
这里是关于的讨论,您可能希望更改保存顺序,以便不创建任何键。我还尝试在表中手动插入数据(与我在代码中所做的相同),插入的所有内容都有错误。linq有问题。您不需要添加这些项,它们已经在上下文中了。你只需要改变他们的状态。好了,伙计们,我设法解决了这个问题@COLDTOLD你说得对,我改变了顺序,一切顺利。@HonorableChow谢谢。我犯了你提到的错误。我只是把状态改为Added,然后就不需要再做AddObject了。