44 lines
1.8 KiB
C#
44 lines
1.8 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
|
|
namespace EnotaryoPH.Data.Extensions
|
|
{
|
|
public static class ModelBuilderExtension
|
|
{
|
|
public static ModelBuilder UseValueConverterForType<T>(this ModelBuilder modelBuilder, ValueConverter converter) => modelBuilder.UseValueConverterForType(typeof(T), converter);
|
|
|
|
public static ModelBuilder UseValueConverterForType(this ModelBuilder modelBuilder, Type type, ValueConverter converter)
|
|
{
|
|
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
|
|
{
|
|
// note that entityType.GetProperties() will throw an exception, so we have to use reflection
|
|
var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == type);
|
|
|
|
foreach (var property in properties)
|
|
{
|
|
modelBuilder.Entity(entityType.Name).Property(property.Name)
|
|
.HasConversion(converter);
|
|
}
|
|
}
|
|
|
|
return modelBuilder;
|
|
}
|
|
|
|
public class DateTimeKindValueConverter : ValueConverter<DateTime, DateTime>
|
|
{
|
|
public DateTimeKindValueConverter(DateTimeKind kind, ConverterMappingHints mappingHints = null)
|
|
: base(
|
|
v => v.ToUniversalTime(),
|
|
v => DateTime.SpecifyKind(v, kind),
|
|
mappingHints)
|
|
{
|
|
}
|
|
}
|
|
|
|
public static void SetDefaultDateTimeKind(this ModelBuilder modelBuilder, DateTimeKind kind)
|
|
{
|
|
modelBuilder.UseValueConverterForType<DateTime>(new DateTimeKindValueConverter(kind));
|
|
modelBuilder.UseValueConverterForType<DateTime?>(new DateTimeKindValueConverter(kind));
|
|
}
|
|
}
|
|
} |