EF Core MySQL: Unable to convert MySQL date/time to System.DateTime 오류 완벽 해결

EF Core를 사용하다가 문제를 발견했습니다. 

오류

※오류해석

위처럼 오류의 내용을 보아 MySql커넥션에 관한 문제일 확률이 높아보였는데 아니나 다를까 예상이 맞았습니다.

위 오류의 원인은 다음과 같습니다.

System.InvalidCastException: 'Unable to convert MySQL date/time to System.DateTime, set AllowZeroDateTime=True or ConvertZeroDateTime=True in the connection string. See https://mysqlconnector.net/connection-options/'

이 말은 set AllowZeroDateTime=True ,ConvertZeroDateTime=True 를 Mysql 커넥션 스트링에 추가로 작성해라 이런 내용의 안내 문장입니다.

그말인 즉 Mysql에서 ZeroTime 데이터가 있다는 소리가 되는데 아니나 다를까 원인은 제로타임 데이터가 맞았습니다.

테스트 환경

※해결법

해결법은 여러가지가 있는데 아래와 같은 해결법이 있습니다.

1.근본적원인 제거

근본적으로 dateTime 형식에 0000-00-00 등과 같은 데이터가 들어가면 안됩니다. 이는 차라리 nullable을 사용해서 null 값을 받던 해야지 이렇게 0000형식의 데이터가 들어가게되면 다른 DB연동, 서비스와 연동 시 다양한 이슈가 발생하기 때문에 지양하는것이 좋습니다.

또한 0000-00-00과 같은 데이터는 근본적으로 아무 의미 없는 데이터이기 때문에 "값이 없다" 라는 것을 표현하려면 null을 사용하는 것이 표준입니다. 이 값을 사용하면 날짜 비교 계산시에 어떤 이슈를 만들어 낼지 모르기 때문입니다.

반응형

2. Connection string수정

1.에서 해결하면 좋지만 실제론 부득이하게 해결할수 없는경우도 있습니다. 이럴때는 말그대로 커넥션 스트링에서
set AllowZeroDateTime=True ,ConvertZeroDateTime=True를 추가해줍니다.

해당 옵션들을 추가하게되면 0000-00-00 값이나 null값을 허용할수 있기에 c#에서 연동할때 해당 minValue관련 오류를 예방할수 있습니다.

옵션 설명
옵션 의미 권장 사항
AllowZeroDateTime=True Zero DateTime 값을 C#의 DateTime.MinValue (0001-01-01 00:00:00)로 변환하여 허용합니다. ConvertZeroDateTime=True와 함께 사용하여 안전성을 높이는 것이 좋습니다.
ConvertZeroDateTime=True Zero DateTime 값을 C#의 null로 변환합니다. (이때 C# 엔티티 필드는 반드시 DateTime? 널 허용 타입이어야 합니다.) 일반적으로 더 권장되는 설정입니다.

 appsetting.json에 접속해서 아래와 같이 AllowZeroDateTim=True; Convert Zero Datetime=True;를 지정해줍니다.

"ConnectionStrings": {
   "TestContext": "Server=TEST;Port=3306;Database=TEST_DB;User=user;Password=1111; AllowZeroDateTime=True; Convert Zero Datetime=True;"
   }

2-1 DateTime ? nullable 추가

가장 중요한점이 위의 string만 추가해놓고 "다 되었다~" 이러고 좋아하면 안됩니다.

위 처럼 0000-00-00값이 이제 null값으로 판정이 되기 때문에 DB의 Datetime 형식의 엔티티컬럼엔 항상 "?" nullable을 붙여야 합니다.

[Keyless]
[Table("users_test")]
public partial class RefuseList
{
    [Key]
    [Column("id")]
    public int? id { get; set; }
 
    [Column("name")]
    [StringLength(8)]
    public string? name { get; set; }
 
    [Column("date")] 
    public DateTime? date { get; set; }
 
}

위처럼 "?" nullable 처리를 같이 해주게 된다면 0000-00-00형식의 데이터라도 제대로 변환이되에 null값으로 조회가 가능하게끔 됩니다.

이런식으로 코드를 통해서 수정 및 조치가 가능하지만 항상 개발자라면 더욱 근본적인 원인을 없애고 수정하는 쪽으로 방향을 맞춰야합니다.


이로써 EF Core MySQL: Unable to convert MySQL date/time to System.DateTime 오류 완벽 해결 오류를 해결했습니다.

이런 경우가 생긴다면 해메지말고 위처럼 한번 해보시길 바라겠습니다!

 

반응형

'C# > ASP.NET CORE' 카테고리의 다른 글

ASP.NET CORE HTTP health Check  (0) 2024.05.20
ASP.NET CORE 전역 에러 처리 Global Error Exception  (0) 2024.03.09
ASP.NET CORE AutoMapper 사용법  (0) 2024.03.05