【问题标题】:Multiplicity constraint violated when trying to clone Entity Framework object尝试克隆实体框架对象时违反多重性约束
【发布时间】: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


    【解决方案1】:

    我通过将所有引用属性的主键设置为 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();
    

    我不确定这是否是正确的方法——它肯定感觉不对——但我找不到任何其他有效的方法。

    【讨论】:

    • 我也不知道它是否正确,但它解决了我的问题,非常感谢。
    • 我有一段代码可以运行多年,但突然抛出这个错误。也感觉不对,但我做了这个方法,它解决了我的问题(只需要 nil 一个特殊的 1 0..1 关系。
    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多