c# - Linq复制/复制整个记录

标签 c# linq linq-to-entities

我正在使用 Linq to entities 进行一般的 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()

The objectContext might be in an inconsistent state. A referential integrity constraint voilation occured. The property values that defines the refrential constraint are not consistent between principal and dependent objects in a relationship.

最佳答案

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

关于c# - Linq复制/复制整个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22765808/

相关文章:

c# - 使用 RestSharp 和 WebAPI 进行数据流传输

C# - 扩展方法示例

c# - 将 LINQ to Entities 查询中的每个项目转换为接口(interface)的最佳方法是什么?

c# - Linq To实体,从选择中选择

c# - Linq to 实体查询在同一个表上使用嵌套查询

c# - Entity Framework - 停止按需延迟加载相关实体?

c# - 不允许重载泛型类型参数?

c# - C# 语法中的问号

c# - Entity Framework - 如何将复杂对象添加到数据库

c# - C#中内联方法的成本