gpt4 book ai didi

c# - 如何处理 Entity Framework 上的 UpdateException - 'Violation of PRIMARY KEY constraint'?

转载 作者:太空狗 更新时间:2023-10-29 21:50:15 33 4
gpt4 key购买 nike

我有一个允许多个用户的应用程序和一个具有 2 个 ID 作为复合键的数据库表。这些 ID 也是来自另一个表的外键。因此,当 2 个用户尝试向该表中添加一个具有相同 ID 的条目时,其中一个用户会因为违反主键约束而获得 UpdateException。我已经发现应该这样处理:

try
{
result = base.SaveChanges(options);
}
catch (UpdateException ex)
{
SqlException innerException = ex.InnerException as SqlException;
if (innerException != null && innerException.Number == 2627 || innerException.Number == 2601)
{
// handle here
}
else
{
throw;
}
}

但是我实际上在“//在这里处理”部分做了什么。我尝试刷新对象,但它处于“已添加”状态,因此无法刷新。我想要它做的是:确认已经有一个具有这些 ID 的对象,删除它想要插入的对象并从数据库加载现有对象。我该怎么做?

最佳答案

自从我得到赞成票后,我回顾了我是如何解决这个问题的。所以这就是我所做的:

// Exception number 2627 = Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.
// Exception number 2601 = Cannot insert duplicate key row in object '%.*ls' with unique index '%.*ls'.
// See http://msdn.microsoft.com/en-us/library/cc645603.aspx for more information and possible exception numbers
if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601))
{
// Resolve the primary key conflict by refreshing and letting the store win
// In order to be able to refresh the entity its state has to be changed from Added to Unchanged
ObjectStateEntry ose = ex.StateEntries.Single();
this.ObjectStateManager.ChangeObjectState(ose.Entity, EntityState.Unchanged);
base.Refresh(RefreshMode.StoreWins, ose.Entity);

// Refresh addedChanges now to remove the refreshed entry from it
addedChanges = this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added).Where(s => !s.IsRelationship);
}
else
{
throw;
}

编辑:

请注意,从 EF 4.1 开始,UpdateException 已重命名为 DbUpdateException

关于c# - 如何处理 Entity Framework 上的 UpdateException - 'Violation of PRIMARY KEY constraint'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22942271/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com