-
-
Notifications
You must be signed in to change notification settings - Fork 78
/
Copy pathMySqlExceptionProcessorInterceptor.cs
44 lines (39 loc) · 1.69 KB
/
MySqlExceptionProcessorInterceptor.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
37
38
39
40
41
42
43
44
using System;
using EntityFramework.Exceptions.Common;
using Microsoft.EntityFrameworkCore;
#if POMELO
using MySqlConnector;
namespace EntityFramework.Exceptions.MySQL.Pomelo;
#else
using MySql.Data.MySqlClient;
namespace EntityFramework.Exceptions.MySQL;
#endif
class MySqlExceptionProcessorInterceptor : ExceptionProcessorInterceptor<MySqlException>
{
protected override DatabaseError? GetDatabaseError(MySqlException dbException)
{
#if POMELO
return dbException.ErrorCode switch
#else
return (MySqlErrorCode)dbException.Number switch
#endif
{
MySqlErrorCode.ColumnCannotBeNull => DatabaseError.CannotInsertNull,
MySqlErrorCode.DuplicateKeyEntry=> DatabaseError.UniqueConstraint,
MySqlErrorCode.WarningDataOutOfRange => DatabaseError.NumericOverflow,
MySqlErrorCode.DataTooLong => DatabaseError.MaxLength,
MySqlErrorCode.NoReferencedRow => DatabaseError.ReferenceConstraint,
MySqlErrorCode.RowIsReferenced => DatabaseError.ReferenceConstraint,
MySqlErrorCode.NoReferencedRow2 => DatabaseError.ReferenceConstraint,
MySqlErrorCode.RowIsReferenced2 => DatabaseError.ReferenceConstraint,
_ => null
};
}
}
public static class ExceptionProcessorExtensions
{
public static DbContextOptionsBuilder UseExceptionProcessor(this DbContextOptionsBuilder self)
=> self.AddInterceptors(new MySqlExceptionProcessorInterceptor());
public static DbContextOptionsBuilder<TContext> UseExceptionProcessor<TContext>(this DbContextOptionsBuilder<TContext> self) where TContext : DbContext
=> self.AddInterceptors(new MySqlExceptionProcessorInterceptor());
}