我将Linq用于一般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可能处于不一致状态。参照
发生完整性约束损坏。该属性值
定义主体之间的约束条件不一致
和关系中的从属对象。
最佳答案
使用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/