C# Linq复制/复制整个记录

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(

我正在使用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可能处于不一致的状态。参考文献 发生完整性约束错误。属性值 定义主体之间的引用约束不一致 和关系中的从属对象


使用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了。