克隆实体因SaveChanges()上的主键违规而失败

时间:2016-04-25 17:40:01

标签: c# entity-framework entity-framework-6 primary-key

我试图复制像here所述的实体。在我的entity-wrapper基类中,我有以下代码来复制/克隆实体。

public TBaseEntityModel Clone(TPrimaryKey newPrimaryKey)
{
    var newEntity = Activator.CreateInstance<TEntity>();
    var clone = DbContext.Entry(newEntity);
    clone.State = EntityState.Added;
    DbContext.Entry(newEntity).CurrentValues.SetValues(TheEntity);
    clone.State = EntityState.Detached;
    var cloneEntityModel= (TBaseEntityModel)Activator.CreateInstance(typeof(TBaseEntityModel), DbContext, newEntity);
    cloneEntityModel.PrimaryKeyValue = newPrimaryKey;
    return cloneEntityModel;
}

在我的具体实体上调用Clone - 方法后,它还将新主键设置为给定值newPrimaryKey

当我在底层上下文中调用SaveChanges()时,会发生这个问题。

然后抛出:

Violation of PRIMARY KEY constraint '...'. Cannot insert duplicate key in object 'dbo....'. The duplicate key value is (553a7aa9-0ac2-40a0-820f-43a3b4af745f).

但是当我查看我的clone时,PK被设置为另一个值。 所以我想这是ObjectContext内部甚至更深层内部的东西。

但我不知道如何逃避错误。

1 个答案:

答案 0 :(得分:0)

我怀疑数据库正在尝试生成主键,但您也在尝试在保存之前明确指定它。如果要指定标识列的值,则需要跳过一些环节(How can I force entity framework to insert identity columns?)。否则,只需不设置该值,并在执行插入时为您生成。