亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用重復的主鍵檢測插入

使用重復的主鍵檢測插入

C#
慕哥9229398 2021-07-06 17:04:25
我的 api 允許嘗試添加具有相同主鍵的實體。但是,我想過濾由于這個原因而發生的 DbUpdateException,因為它們只會污染我的日志文件。我在生產中使用 Sqlite 進行測試和 Postgres,所以我想要一種可以返回一些異常類型以獲取原因的方法。
查看完整描述

3 回答

?
慕雪6442864

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想法應該是一樣的


查看完整回答
反對 回復 2021-07-18
?
胡子哥哥

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;

        }

    }

}


查看完整回答
反對 回復 2021-07-18
  • 3 回答
  • 0 關注
  • 368 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號