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 |
