-
-
Notifications
You must be signed in to change notification settings - Fork 77
/
Copy pathSqliteExceptionProcessorInterceptor.cs
36 lines (31 loc) · 1.45 KB
/
SqliteExceptionProcessorInterceptor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using EntityFramework.Exceptions.Common;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using static SQLitePCL.raw;
namespace EntityFramework.Exceptions.Sqlite;
class SqliteExceptionProcessorInterceptor : ExceptionProcessorInterceptor<SqliteException>
{
protected override DatabaseError? GetDatabaseError(SqliteException dbException)
{
if (dbException.SqliteErrorCode == SQLITE_CONSTRAINT || dbException.SqliteErrorCode == SQLITE_TOOBIG)
{
return dbException.SqliteExtendedErrorCode switch
{
SQLITE_TOOBIG => DatabaseError.MaxLength,
SQLITE_CONSTRAINT_NOTNULL => DatabaseError.CannotInsertNull,
SQLITE_CONSTRAINT_UNIQUE => DatabaseError.UniqueConstraint,
SQLITE_CONSTRAINT_PRIMARYKEY => DatabaseError.UniqueConstraint,
SQLITE_CONSTRAINT_FOREIGNKEY => DatabaseError.ReferenceConstraint,
_ => null
};
}
return null;
}
}
public static class ExceptionProcessorExtensions
{
public static DbContextOptionsBuilder UseExceptionProcessor(this DbContextOptionsBuilder self)
=> self.AddInterceptors(new SqliteExceptionProcessorInterceptor());
public static DbContextOptionsBuilder<TContext> UseExceptionProcessor<TContext>(this DbContextOptionsBuilder<TContext> self) where TContext : DbContext
=> self.AddInterceptors(new SqliteExceptionProcessorInterceptor());
}