in src/Modules/SimplCommerce.Module.Core/Data/SimplDbContext.cs [36:79]
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
List<Type> typeToRegisters = new List<Type>();
foreach (var module in GlobalConfiguration.Modules)
{
typeToRegisters.AddRange(module.Assembly.DefinedTypes.Select(t => t.AsType()));
}
RegisterEntities(modelBuilder, typeToRegisters);
RegisterConvention(modelBuilder);
base.OnModelCreating(modelBuilder);
RegisterCustomMappings(modelBuilder, typeToRegisters);
if (Database.ProviderName == "Microsoft.EntityFrameworkCore.Sqlite")
{
// SQLite does not have proper support for DateTimeOffset via Entity Framework Core, see the limitations
// here: https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations#query-limitations
// To work around this, when the Sqlite database provider is used, all model properties of type DateTimeOffset
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(DateTimeOffset) || p.PropertyType == typeof(DateTimeOffset?));
foreach (var property in properties)
{
modelBuilder
.Entity(entityType.Name)
.Property(property.Name)
.HasConversion(new DateTimeOffsetToBinaryConverter());
}
var decimalProperties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(decimal) || p.PropertyType == typeof(decimal?));
foreach (var property in decimalProperties)
{
modelBuilder
.Entity(entityType.Name)
.Property(property.Name)
.HasConversion<double>();
}
}
}
}