2016-07-29 31 views
2

我需要在一个请求中删除并添加具有相同主键值的实体,任何人都可以向我推荐解决方案吗?实体框架:在一个请求中删除并添加具有相同密钥的实体

以下是我的示例代码,其中给出了错误:违反PRIMARY KEY约束'PK_Table'。不能在对象'dbo.Table'中插入重复键。

context.Set<Entity>().Attach(existingEntityObj); 
Entry(existingEntityObj).State = EntityState.Deleted; 

context.Set<Entity>().Add(newEntityObj); 
context.Entry<Entity>(newEntityObj).State = EntityState.Added; 

context.SaveChanges(); 

假设两个物体(existingEntityObj和newEntityObj)具有在主键属性相同的值。

在此先感谢!

+1

你将不得不放弃主键约束,删除你的实体,添加你的实体,并添加主键约束。但是,当FK引用它时,您不能删除主键约束。你在做什么听起来像一个坏主意。你能不能用新对象的数据修改现有的对象? – Pakman

回答

2

您需要执行两次SaveChanges()调用才能完成此工作。这里的问题在于,虽然看起来您首先删除了记录并添加了新记录,但框架实际上是先插入记录。

原因是因为实体框架并不能让您精确控制操作发生的顺序。所以最好的办法是将两者包装在单独的TransactionScope中,这将允许您控制单个事务发生。

你可以在这里阅读更多:https://blogs.msdn.microsoft.com/alexj/2009/01/11/savechangesfalse/

+0

与交易示例相似的答案https://stackoverflow.com/questions/2600688/clear-an-entitycollection-and-then-add-to-it-within-the-same-transaction-doesnt/2601143#2601143 –

2

一个更新语句可以为你工作,所以解决的办法就是更新旧实体的新的实体价值,如果你想保持相同的主键值。当主键标识一个实体时,删除一个实体并添加一个新实体代替实体会产生与更新相同的效果。

纠正我,如果你觉得我错了,给我一个完美的例子。

相关问题