3 回答

TA貢獻1812條經驗 獲得超5個贊
對于 Sql Server,您可以使用SqlException.Numberof 的內部異常的屬性DbUpdateException來識別Violation of PRIMARY KEY錯誤。對于主鍵沖突 SqlException.Number = 2627。你可以嘗試這樣的事情:
try
{
db.SaveChanges();
}
catch (DbUpdateException ex)
{
if (ex.InnerException is SqlException sqlEx && sqlEx.Number == 2627)
{
}
}
我相信 forSqlite和Postgres想法應該是一樣的

TA貢獻1825條經驗 獲得超6個贊
我最終得到了一些 DbUpdateException 的擴展類,但仍然有點hacky:
public static class UpdateExceptionHelper
{
public enum UpdateExceptionKind
{
UniqueViolation,
ForeignKeyViolation,
Unknown
}
public static UpdateExceptionKind Kind(this DbUpdateException dbUpdateException)
{
var inner = dbUpdateException.InnerException;
switch (inner)
{
case null:
return UpdateExceptionKind.Unknown;
case SqliteException sqlite:
return sqlite.Kind();
case PostgresException postgres:
return postgres.Kind();
default:
throw new Exception($"Unsupported Database Provider with Exception Type: {inner.GetType().Name}");
}
}
private static UpdateExceptionKind Kind(this PostgresException e)
{
const string UNIQUE_VIOLATION = "23505";
const string FOREIGN_KEY_VIOLATION = "23503";
switch (e.SqlState)
{
case UNIQUE_VIOLATION:
return UpdateExceptionKind.UniqueViolation;
case FOREIGN_KEY_VIOLATION:
return UpdateExceptionKind.ForeignKeyViolation;
default:
return UpdateExceptionKind.Unknown;
}
}
private static UpdateExceptionKind Kind(this SqliteException e)
{
const int SQLITE_CONSTRAINT_UNIQUE = 2067;
const int SQLITE_CONSTRAINT_PRIMARYKEY = 1555;
const int SQLITE_CONSTRAINT_FOREIGNKEY = 787;
switch (e.SqliteExtendedErrorCode)
{
case SQLITE_CONSTRAINT_PRIMARYKEY:
case SQLITE_CONSTRAINT_UNIQUE:
return UpdateExceptionKind.UniqueViolation;
case SQLITE_CONSTRAINT_FOREIGNKEY:
return UpdateExceptionKind.ForeignKeyViolation;
default:
return UpdateExceptionKind.Unknown;
}
}
}
- 3 回答
- 0 關注
- 368 瀏覽
添加回答
舉報