我正在使用 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/