首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检测具有重复主键的插入

检测具有重复主键的插入
EN

Stack Overflow用户
提问于 2018-06-02 06:03:14
回答 1查看 913关注 0票数 0

我的api允许尝试添加具有相同主键的实体。然而,我想过滤由于这个原因发生的DbUpdateException,因为它们只会污染我的日志文件。我使用Sqlite进行测试,在生产中使用Postgres,所以我想要一种可以返回给我一些异常的方法来获得原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 18:59:47

我最终得到了一些DbUpdateException的扩展类,仍然有点老套:

代码语言:javascript
复制
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;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50651480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档