using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using System; using System.Linq; namespace IoTSharp.Hub.Data { public class ApplicationDbContext : IdentityDbContext { private IConfiguration _configuration; public ApplicationDbContext(DbContextOptions options, IConfiguration configuration) : base(options) { _configuration = configuration; var _DataBase = configuration["DataBase"] ?? "sqlite"; if (Enum.TryParse(_DataBase, out DatabaseType databaseType)) { DatabaseType = databaseType; } if (Database.GetPendingMigrations().Count() > 0) { Database.Migrate(); } } public DatabaseType DatabaseType { get; private set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .HasDiscriminator(nameof(Data.DataStorage.Catalog)) .HasValue(DataCatalog.None) .HasValue(DataCatalog.AttributeData) .HasValue(DataCatalog.AttributeLatest) .HasValue(DataCatalog.TelemetryData) .HasValue(DataCatalog.TelemetryLatest); modelBuilder.Entity().HasDiscriminator(nameof(Data.DataStorage.Catalog)); modelBuilder.Entity().HasDiscriminator(nameof(Data.DataStorage.Catalog)); modelBuilder.Entity().HasDiscriminator(nameof(Data.DataStorage.Catalog)); modelBuilder.Entity().HasDiscriminator(nameof(Data.DataStorage.Catalog)); switch (DatabaseType) { case DatabaseType.mssql: ForSqlServer(modelBuilder); break; case DatabaseType.npgsql: ForNpgsql(modelBuilder); break; case DatabaseType.sqlite: break; default: break; } } private void ForNpgsql(ModelBuilder modelBuilder) { modelBuilder.Entity() .Property(b => b.Value_Json) .HasColumnType("jsonb"); modelBuilder.Entity() .Property(b => b.Value_XML) .HasColumnType("xml"); modelBuilder.Entity() .Property(b => b.Value_Json) .HasColumnType("jsonb"); modelBuilder.Entity() .Property(b => b.Value_XML) .HasColumnType("xml"); modelBuilder.Entity() .Property(b => b.Value_Json) .HasColumnType("jsonb"); modelBuilder.Entity() .Property(b => b.Value_XML) .HasColumnType("xml"); modelBuilder.Entity() .Property(b => b.Value_Json) .HasColumnType("jsonb"); modelBuilder.Entity() .Property(b => b.Value_XML) .HasColumnType("xml"); } private void ForSqlServer(ModelBuilder modelBuilder) { modelBuilder.Entity() .Property(b => b.Value_XML) .HasColumnType("xml"); modelBuilder.Entity() .Property(b => b.Value_XML) .HasColumnType("xml"); modelBuilder.Entity() .Property(b => b.Value_XML) .HasColumnType("xml"); modelBuilder.Entity() .Property(b => b.Value_XML) .HasColumnType("xml"); } public DbSet Tenant { get; set; } public DbSet Customer { get; set; } public DbSet Relationship { get; set; } public DbSet Device { get; set; } public DbSet TelemetryData { get; set; } public DbSet AttributeLatest { get; set; } public DbSet DataStorage { get; set; } public DbSet AttributeData { get; set; } public DbSet TelemetryLatest { get; set; } } }