ApplicationDbContext.cs 4.6 KB
Newer Older
1 2
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
麦壳饼's avatar
麦壳饼 已提交
3 4 5 6
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;
using System.Linq;
麦壳饼's avatar
麦壳饼 已提交
7

麦壳饼's avatar
麦壳饼 已提交
8 9 10 11
namespace IoTSharp.Hub.Data
{
    public class ApplicationDbContext : IdentityDbContext
    {
麦壳饼's avatar
麦壳饼 已提交
12 13
        private IConfiguration _configuration;

麦壳饼's avatar
麦壳饼 已提交
14 15 16 17 18 19 20 21 22
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IConfiguration configuration)
            : base(options)
        {
            _configuration = configuration;
            var _DataBase = configuration["DataBase"] ?? "sqlite";
            if (Enum.TryParse(_DataBase, out DatabaseType databaseType))
            {
                DatabaseType = databaseType;
            }
麦壳饼's avatar
麦壳饼 已提交
23
            if (Database.GetPendingMigrations().Count() > 0)
麦壳饼's avatar
麦壳饼 已提交
24
            {
麦壳饼's avatar
麦壳饼 已提交
25
                Database.Migrate();
麦壳饼's avatar
麦壳饼 已提交
26
            }
麦壳饼's avatar
麦壳饼 已提交
27
          
麦壳饼's avatar
麦壳饼 已提交
28
        }
麦壳饼's avatar
麦壳饼 已提交
29

麦壳饼's avatar
麦壳饼 已提交
30 31 32 33
        public DatabaseType DatabaseType { get; private set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
麦壳饼's avatar
麦壳饼 已提交
34
            base.OnModelCreating(modelBuilder);
麦壳饼's avatar
麦壳饼 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47
    
            modelBuilder.Entity<DataStorage>()
           .HasDiscriminator<DataCatalog>(nameof(Data.DataStorage.Catalog))
           .HasValue<DataStorage>(DataCatalog.None)
           .HasValue<AttributeData>(DataCatalog.AttributeData)
                  .HasValue<AttributeLatest>(DataCatalog.AttributeLatest)
                         .HasValue<TelemetryData>(DataCatalog.TelemetryData)
           .HasValue<TelemetryLatest>(DataCatalog.TelemetryLatest);

            modelBuilder.Entity<AttributeData>().HasDiscriminator<DataCatalog>(nameof(Data.DataStorage.Catalog));
            modelBuilder.Entity<AttributeLatest>().HasDiscriminator<DataCatalog>(nameof(Data.DataStorage.Catalog));
            modelBuilder.Entity<TelemetryData>().HasDiscriminator<DataCatalog>(nameof(Data.DataStorage.Catalog));
            modelBuilder.Entity<TelemetryLatest>().HasDiscriminator<DataCatalog>(nameof(Data.DataStorage.Catalog));
麦壳饼's avatar
麦壳饼 已提交
48 49
            

麦壳饼's avatar
麦壳饼 已提交
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67


            switch (DatabaseType)
            {
                case DatabaseType.mssql:
                    ForSqlServer(modelBuilder);
                    break;

                case DatabaseType.npgsql:
                    ForNpgsql(modelBuilder);
                    break;

                case DatabaseType.sqlite:
                    break;

                default:
                    break;
            }
麦壳饼's avatar
麦壳饼 已提交
68 69
        }

麦壳饼's avatar
麦壳饼 已提交
70
     
麦壳饼's avatar
麦壳饼 已提交
71 72
        private void ForNpgsql(ModelBuilder modelBuilder)
        {
麦壳饼's avatar
麦壳饼 已提交
73
            modelBuilder.Entity<TelemetryData>()
麦壳饼's avatar
麦壳饼 已提交
74 75 76
            .Property(b => b.Value_Json)
            .HasColumnType("jsonb");

麦壳饼's avatar
麦壳饼 已提交
77
            modelBuilder.Entity<TelemetryData>()
麦壳饼's avatar
麦壳饼 已提交
78 79 80
            .Property(b => b.Value_XML)
            .HasColumnType("xml");

麦壳饼's avatar
麦壳饼 已提交
81
            modelBuilder.Entity<AttributeLatest>()
麦壳饼's avatar
麦壳饼 已提交
82 83 84
            .Property(b => b.Value_Json)
            .HasColumnType("jsonb");

麦壳饼's avatar
麦壳饼 已提交
85
            modelBuilder.Entity<AttributeLatest>()
麦壳饼's avatar
麦壳饼 已提交
86 87 88
            .Property(b => b.Value_XML)
            .HasColumnType("xml");

89
            modelBuilder.Entity<AttributeData>()
麦壳饼's avatar
麦壳饼 已提交
90 91 92
            .Property(b => b.Value_Json)
            .HasColumnType("jsonb");

93
            modelBuilder.Entity<AttributeData>()
麦壳饼's avatar
麦壳饼 已提交
94 95 96 97
            .Property(b => b.Value_XML)
            .HasColumnType("xml");

            modelBuilder.Entity<TelemetryLatest>()
麦壳饼's avatar
麦壳饼 已提交
98 99
            .Property(b => b.Value_Json)
            .HasColumnType("jsonb");
麦壳饼's avatar
麦壳饼 已提交
100 101

            modelBuilder.Entity<TelemetryLatest>()
麦壳饼's avatar
麦壳饼 已提交
102 103 104
            .Property(b => b.Value_XML)
            .HasColumnType("xml");
        }
麦壳饼's avatar
麦壳饼 已提交
105

麦壳饼's avatar
麦壳饼 已提交
106 107
        private void ForSqlServer(ModelBuilder modelBuilder)
        {
麦壳饼's avatar
麦壳饼 已提交
108
            modelBuilder.Entity<TelemetryData>()
麦壳饼's avatar
麦壳饼 已提交
109 110
            .Property(b => b.Value_XML)
            .HasColumnType("xml");
麦壳饼's avatar
麦壳饼 已提交
111

麦壳饼's avatar
麦壳饼 已提交
112
            modelBuilder.Entity<AttributeLatest>()
麦壳饼's avatar
麦壳饼 已提交
113 114
            .Property(b => b.Value_XML)
            .HasColumnType("xml");
麦壳饼's avatar
麦壳饼 已提交
115

麦壳饼's avatar
麦壳饼 已提交
116
            modelBuilder.Entity<DataStorage>()
麦壳饼's avatar
麦壳饼 已提交
117 118
            .Property(b => b.Value_XML)
            .HasColumnType("xml");
麦壳饼's avatar
麦壳饼 已提交
119 120

            modelBuilder.Entity<TelemetryLatest>()
麦壳饼's avatar
麦壳饼 已提交
121 122
            .Property(b => b.Value_XML)
            .HasColumnType("xml");
麦壳饼's avatar
麦壳饼 已提交
123
        }
麦壳饼's avatar
麦壳饼 已提交
124

麦壳饼's avatar
麦壳饼 已提交
125 126 127 128 129 130 131 132 133
        public DbSet<Tenant> Tenant { get; set; }
        public DbSet<Customer> Customer { get; set; }
        public DbSet<Relationship> Relationship { get; set; }
        public DbSet<Device> Device { get; set; }
        public DbSet<TelemetryData> TelemetryData { get; set; }
        public DbSet<AttributeLatest> AttributeLatest { get; set; }
        public DbSet<DataStorage> DataStorage { get; set; }
        public DbSet<AttributeData> AttributeData { get; set; }
        public DbSet<TelemetryLatest> TelemetryLatest { get; set; }
麦壳饼's avatar
麦壳饼 已提交
134 135
    }
}