【发布时间】:2016-04-26 03:51:26
【问题描述】:
我正在尝试复制here 中描述的实体。在我的实体包装器基类中,我有以下代码来复制/克隆实体。
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 里面的东西,甚至更深的东西。
但我不知道如何摆脱错误。
【问题讨论】:
-
TBaseEntityModel的构造函数发生了什么? -
它只设置
DbContext和TheEntity这两个属性都在Clone方法中使用。它还设置了一个布尔标志,它将在SaveChanges()之前将实体的状态设置为Added。也许有问题? -
如果没有所有这些不可见的活动部件,很难分辨。无论如何,我不会为实体提供对上下文的引用。克隆方法应该简单地做到这一点:创建一个克隆。它不应该参与克隆的状态。
标签: c# entity-framework entity-framework-6 primary-key