EF Core ไม่เก็บ DateTime.Kind ลงฐานข้อมูล

wk
1 min readJun 6, 2020

--

ตัวอย่าง

ในฟังก์ชัน Insert มีการเก็บข้อมูล Student โดยในฟิลด์ Birth ได้แยก DateTime.Kind ออกเป็นสองแบบ คือ DateTimeKind.Utc และ DateTimeKind.Local

$ curl -s http://localhost:5000/api/student/insert | jq[
{
"birth": "2020-06-06T15:58:02.414755Z",
"kind": "Utc",
"name": "wk (Utc)"
},
{
"birth": "2020-06-06T22:58:02.414755+07:00",
"kind": "Local",
"name": "wk (Local)"
}
]

แต่เมื่อดึงข้อมูลผ่าน DbContext ของ EF Core กลับพบว่า DateTimeKind ทั้งสองแบบถูกเซ็ตเป็น Unspecified หมายความว่า เราไม่มีทางรู้ว่า DateTime ที่ได้นั้น เป็น Local Time Zone (+7 สำหรับประเทศไทย) หรือ Utc (+0)

$ curl -s http://localhost:5000/api/student/query | jq[
{
"birth": "2020-06-06T15:58:02.414755",
"kind": "Unspecified",
"name": "wk (Utc)"
},
{
"birth": "2020-06-06T22:58:02.414755",
"kind": "Unspecified",
"name": "wk (Local)"
}
]

ปัญหานี้เกิดจาก ข้อจำกัดของ DBMS เช่น SQLite / MSSQL ไม่สามารถเก็บฟิลด์ DateTime + Kind ของ .NET ได้

ดังนั้น เพื่อป้องกันความสับสน การเก็บข้อมูลจึงควรเลือก Time Zone อย่างใดอย่างหนึ่งเท่านั้น เช่น เปลี่ยน DateTime.Kind เป็น DateTimeKind.Utc ก่อน เช่น

context.Students.Add
({ Id = 0
Name = "wk"
Birth = date.ToUniversalTime() })

--

--

No responses yet