【发布时间】:2016-08-16 05:13:31
【问题描述】:
我正在尝试使用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 StackTrace: 在 System.Data.Entity.Core.Objects.EntityEntry.WillNotRefSteal(EntityReference refToPrincipal, IEntityWrapper 包装的Principal) 在 System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipal(EntityReference relatedEnd, EntityKey foreignKey, Boolean setIsLoaded, Boolean 替换现有引用) 在 System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys(布尔 replaceAddedRefs, EntitySetBase restrictTo) 在
请注意,Property1 是一个完整对象,其外键返回到 MyObject。据我所知,多重性错误来自这样一个事实,即现有实体和我的克隆之间的 Property1 对象根据 EF 是“相同的”(它们不是引用相等,我检查过)。
从上面的答案来看,我认为当使用AsNoTracking 时,EF 会处理这个问题并生成一个新版本的Property1 实体以保存到数据库中。不是这样吗?如果没有,用所有引用的属性克隆我的整个实体的最佳方法是什么?
【问题讨论】:
标签: c# entity-framework orm clone