2016-04-22 57 views
2

我试图使用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实体来保存到数据库。这不是这种情况吗?如果不是,用所有引用属性克隆整个实体的最佳方法是什么?

回答

3

我解决了这个问题的所有引用属性的主键设置为0。所以我的代码现在看起来像

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); 
clone.Property1.Id = 0; 
clone.Property2.Id = 0; 
clone.Property3.Id = 0; 
dbSet.Add(clone); 
context.SaveChanges(); 

我不知道这是否是做正确的方式这个,它肯定没有按感觉不错 - 但我一直无法找到其他可行的东西。

+0

我不知道它是否正确,但它解决了我的问题,所以谢谢。 –

相关问题