entity framework中的重复关键exception?
我正在尝试捕获当我将具有给定用户名的已存在用户插入我的数据库时抛出的exception。 正如标题所说,那时我正在使用EF。 当我尝试将用户插入到db时抛出的唯一exception是“UpdateException” – 如何提取此exception以识别它是重复的exception还是其他什么?
catch (UpdateException ex) { SqlException innerException = ex.InnerException as SqlException; if (innerException != null && innerException.Number == ??????) { // handle exception here.. } else { throw; } }
把正确的号码放在??????
这对应于唯一约束违规(我不知道从头到尾)。
因为我在C#中使用EntityFramework,所以我不得不对此做一点改动 – 希望它对任何人有帮助……
try { await db.SaveChangesAsync(); } catch (DbUpdateException ex) { SqlException innerException = ex.InnerException.InnerException as SqlException; if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601)) { //your handling stuff } else { throw; } }
我的问题是因为我需要DbUpdateException而不是UpdateException,而我的InnerException对象有一个额外的InnerException对象,其中包含我需要的数字……
现在在C#6.0中你应该能够做到这样的事情:
catch (UpdateException ex) when ((ex.InnerException as SqlException)?.Number == ??????) { // Handle exception here }
如果你防止exception发生,我认为它会更好。 如果可以使用您的代码,我会执行以下操作:
使用entity framework时,最好的办法是首先尝试使用LINQ的SingleOrDefault获取会给您带来麻烦的条目。 现在,您可以使用要插入的实例更新已获取的实体,如果您使用它,则可以使用自动增量保护您的ID号。 如果SingleOrDefault为null,您可以安全地添加您的实体。
代码示例:
public override void AddOrUpdate(CustomCaseSearchCriteria entity) { var duplicateEntityCheck = GetSingleByUniqueConstraint(entity.UserCode, entity.FilterName); if (duplicateEntityCheck != null) { duplicateEntityCheck.Overwrite(entity); base.Update(duplicateEntityCheck); } else base.Add(entity); } public virtual CustomCaseSearchCriteria GetSingleByUniqueConstraint(string userCode, string filterName) { return GetAllInternal().SingleOrDefault(sc => sc.UserCode == userCode && sc.FilterName == filterName); }