我正在使用Linq对实体进行一般CRUD操作。最近,我看到了一个场景,我必须在数据库中复制整个记录(在所有相关表中都有不同的主键)。我的DB结构很简单。我有主桌(比如说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将其对象状态更改为"Added“)//这里我访问子表B
2)使用context.AddToA(AObj)在上下文中添加对象
3)然后做saveChanges()
objectContext可能处于不一致的状态。发生了引用完整性约束无效。定义refrential约束的属性值在关系中的主体对象和依赖对象之间不一致。
发布于 2014-04-17 09:03:47
使用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()的讨论
https://stackoverflow.com/questions/22765808
复制相似问题