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 { 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 (this.Database.EnsureCreated()) { if (Database.GetPendingMigrations().Count() > 0) { // Database.Migrate(); } } } public DatabaseType DatabaseType { get; private set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); 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 AttributeData { get; set; } public DbSet TelemetryLatest { get; set; } } }