我试图使用this answer中的方法复制实体框架中的对象,但是当我调用Add(clone)
时,我得到一个InvalidOperationException,指出违反了多重性约束。我的代码看起来像这样试图克隆实体框架对象时违反了多重性约束
var dbSet = context.Set<MyObject>()
var clone = dbSet.Include(e => e.Property1)
.Include(e => e.Property2)
.Include(e => e.Property3)
.AsNoTracking()
.First(e => e.Id == OriginalPrimaryKey)
dbSet.Add(clone); // Throws InvalidOperationException
context.SaveChanges();
堆栈跟踪看起来像
System.InvalidOperationException了用户代码
的HResult = -2146233079消息=多重约束违反未处理。 角色'MyObject_Property1_Target'的关系 'DataModels.MyObject_Property1'具有 重复1或0..1。源=的EntityFramework堆栈跟踪: 在System.Data.Entity.Core.Objects.EntityEntry.WillNotRefSteal(的EntityReference refToPrincipal,IEntityWrapper wrappedPrincipal) 在System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipal(的EntityReference relatedEnd,的EntityKey FOREIGNKEY布尔setIsLoaded,布尔 replaceExistingRef) 在System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys(布尔 replaceAddedRefs,EntitySetBase restrictTo) 在
注意Property1
是一个外键完整的对象BA ck到MyObject
。从我所知道的情况来看,多重性错误来自事实上,根据EF,现有实体和我的克隆之间的对象是“相同的”(我检查过它们不是相同的)。
从上面的答案看来,我想在使用AsNoTracking
时EF会处理这个并生成一个新版本的Property1
实体来保存到数据库。这不是这种情况吗?如果不是,用所有引用属性克隆整个实体的最佳方法是什么?
我不知道它是否正确,但它解决了我的问题,所以谢谢。 –