پشتیبانی از DateOnly و TimeOnly با Entity Framework Core 6.0
آخرین بروز رسانی: 1401/07/09
متأسفانه، Entity Framework Core 6.0 در SQL Server از این نوع داده های جدید پشتیبانی نمی کند. این به این دلیل اتفاق میافتد که ارائهدهنده اصلی، Microsoft.Data.SqlClient، همانطور که در مورد مشکل GitHub توضیح داده شد، از آنها پشتیبانی نمیکند. جالب اینه که در عوض، Microsoft.Data.Sqlite به طور کامل از DateOnly و TimeOnly پشتیبانی می کنه، بنابراین ما می توانیم آنها را با Entity Framework Core 6.0 و ارائه دهنده SQLite استفاده کنیم.
اما... در مورد SQL Server چطور؟ در مورد System.Text.Json ما دو مبدل برای deserialize/deserialize کردن این نوع توسعه دادیم. ما میتوانیم همین کار را با Entity Framework Core با استفاده از ValueConverter انجام دهیم:
public class DateOnlyConverter : ValueConverter<DateOnly, DateTime>
{
public DateOnlyConverter() : base(
dateOnly => dateOnly.ToDateTime(TimeOnly.MinValue),
dateTime => DateOnly.FromDateTime(dateTime))
{
}
}
public class DateOnlyComparer : ValueComparer<DateOnly>
{
public DateOnlyComparer() : base(
(d1, d2) => d1.DayNumber == d2.DayNumber,
d => d.GetHashCode())
{
}
}
public class TimeOnlyConverter : ValueConverter<TimeOnly, TimeSpan>
{
public TimeOnlyConverter() : base(
timeOnly => timeOnly.ToTimeSpan(),
timeSpan => TimeOnly.FromTimeSpan(timeSpan))
{
}
}
public class TimeOnlyComparer : ValueComparer<TimeOnly>
{
public TimeOnlyComparer() : base(
(t1, t2) => t1.Ticks == t2.Ticks,
t => t.GetHashCode())
{
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>(builder =>
{
// Date is a DateOnly property and date on database
builder.Property(x => x.Date)
.HasConversion<DateOnlyConverter, DateOnlyComparer>();
// Time is a TimeOnly property and time on database
builder.Property(x => x.Time)
.HasConversion<TimeOnlyConverter, TimeOnlyComparer>();
});
}