我正在使用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可能处于不一致状态。参考 发生完整性约束声音。该属性值 定义refrential约束在principal之间不一致 和关系中的依赖对象。
答案 0 :(得分:0)
使用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()
的讨论