diff --git a/IoTSharp/Controllers/DevicesController.cs b/IoTSharp/Controllers/DevicesController.cs index 30b8bb5aff9cfecbd70894a05dd74ec88e05ccf5..77b1b3258620766526ee6968d4eb5aca0a2d332e 100644 --- a/IoTSharp/Controllers/DevicesController.cs +++ b/IoTSharp/Controllers/DevicesController.cs @@ -82,12 +82,12 @@ namespace IoTSharp.Controllers [HttpGet("{deviceId}/AttributeLatest")] public async Task>> GetAttributeLatest(Guid deviceId) { - var devid = from dev in _context.Device.Include(d =>d.AttributeLatest) where dev.Id == deviceId select dev.AttributeLatest; + var devid = from dev in _context.AttributeLatest where dev.DeviceId == deviceId select dev ; if (!devid.Any()) { return NotFound(new ApiResult(ApiCode.NotFoundDeviceIdentity, $"Device's Identity not found ")); } - return await devid.FirstOrDefaultAsync(); + return await devid.ToListAsync(); } /// @@ -99,12 +99,12 @@ namespace IoTSharp.Controllers [HttpGet("{deviceId}/TelemetryLatest")] public async Task>> GetTelemetryLatest(Guid deviceId) { - var devid = from dev in _context.Device.Include(d=>d.TelemetryLatest) where dev.Id == deviceId select dev.TelemetryLatest; + var devid = from dev in _context.TelemetryLatest where dev.DeviceId == deviceId select dev; if (!devid.Any()) { return NotFound(new ApiResult(ApiCode.NotFoundDeviceIdentity, $"Device's Identity not found ")); } - return await devid.FirstOrDefaultAsync(); + return await devid.ToListAsync(); } /// /// Request telemetry values from the server @@ -123,7 +123,7 @@ namespace IoTSharp.Controllers } else { - var kv = from t in _context.TelemetryLatest where t.Device == dev && t.KeyName == keyName select t; + var kv = from t in _context.TelemetryLatest where t.DeviceId == dev.Id && t.KeyName == keyName select t; return (await kv.FirstOrDefaultAsync())?.ToObject(); } } @@ -144,7 +144,7 @@ namespace IoTSharp.Controllers } else { - var kv = from t in _context.AttributeLatest where t.Device == dev && t.KeyName == keyName select t; + var kv = from t in _context.AttributeLatest where t.DeviceId == dev.Id && t.KeyName == keyName select t; return (await kv.FirstOrDefaultAsync())?.ToObject(); } } @@ -167,7 +167,7 @@ namespace IoTSharp.Controllers } else { - var kv = from t in _context.TelemetryLatest where t.Device == dev && t.KeyName == keyName && t.DateTime >= begin select t.ToObject(); + var kv = from t in _context.TelemetryLatest where t.DeviceId == dev.Id && t.KeyName == keyName && t.DateTime >= begin select t.ToObject(); return await kv.ToArrayAsync(); } } @@ -190,7 +190,7 @@ namespace IoTSharp.Controllers } else { - var kv = from t in _context.TelemetryLatest where t.Device == dev && t.KeyName == keyName && t.DateTime>=begin && t.DateTime =begin && t.DateTime ().HasKey(c => new { c.Catalog, c.DeviceId, c.KeyName, c.DateTime }); + modelBuilder.Entity().HasIndex(c => c.Catalog); + modelBuilder.Entity().HasIndex(c => new { c.Catalog, c.DeviceId }); + modelBuilder.Entity().HasIndex(c => new {c.Catalog,c.DeviceId, c.KeyName } ); + modelBuilder.Entity().HasIndex(c => new { c.Catalog, c.DeviceId, c.KeyName,c.DateTime }); modelBuilder.Entity() .HasDiscriminator(nameof(Data.DataStorage.Catalog)) .HasValue(DataCatalog.None) diff --git a/IoTSharp/Data/DataStorage.cs b/IoTSharp/Data/DataStorage.cs index 5ffa4d9475f970bddeb2a4a1ddabe2cd36b5d9bc..c87fd8e04d3dac36492d64efa8405c0db508acda 100644 --- a/IoTSharp/Data/DataStorage.cs +++ b/IoTSharp/Data/DataStorage.cs @@ -1,34 +1,31 @@ using System; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace IoTSharp.Data { public class DataStorage { - [Key] - public Guid Id { get; set; } = Guid.NewGuid(); + [EnumDataType(typeof(DataCatalog)), Column(Order = 0)] + public DataCatalog Catalog { get; set; } + + [Newtonsoft.Json.JsonIgnore, Column(Order = 1)] + public Guid DeviceId { get; set; } - [Required] + [Column(Order = 2)] public string KeyName { get; set; } - [Newtonsoft.Json.JsonIgnore] - [Required] - public Device Device { get; set; } + [Column(Order = 3)] + public DateTime DateTime { get; set; } - [Required] + [Column(Order = 4)] [EnumDataType(typeof(DataSide))] public DataSide DataSide { get; set; } = DataSide.AnySide; - [Required] - [EnumDataType(typeof(DataCatalog))] - public DataCatalog Catalog { get; set; } - - [Required] + [Column(Order = 5)] [EnumDataType(typeof(DataType))] public DataType Type { get; set; } - public DateTime DateTime { get; set; } - public bool Value_Boolean { get; set; } public string Value_String { get; set; } public long Value_Long { get; set; } diff --git a/IoTSharp/Data/Device.cs b/IoTSharp/Data/Device.cs index 7148a872c80ac0b2f926671ab2cf5a809cabd040..6dcd270c559b4fe62a17af018bf470e772a91757 100644 --- a/IoTSharp/Data/Device.cs +++ b/IoTSharp/Data/Device.cs @@ -15,14 +15,5 @@ namespace IoTSharp.Data public Customer Customer { get; set; } - [Newtonsoft.Json.JsonIgnore] - public virtual List AttributeData { get; set; } - - [Newtonsoft.Json.JsonIgnore] - public virtual List TelemetryData { get; set; } - - public virtual List AttributeLatest { get; set; } - - public virtual List TelemetryLatest { get; set; } } } \ No newline at end of file diff --git a/IoTSharp/Data/Migrations/20190903070558_ReDesingerDataStorage.Designer.cs b/IoTSharp/Data/Migrations/20190903070558_ReDesingerDataStorage.Designer.cs new file mode 100644 index 0000000000000000000000000000000000000000..d00366d5ddf706a451ee8cb333af7d85d77db935 --- /dev/null +++ b/IoTSharp/Data/Migrations/20190903070558_ReDesingerDataStorage.Designer.cs @@ -0,0 +1,553 @@ +// +using System; +using IoTSharp.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace IoTSharp.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20190903070558_ReDesingerDataStorage")] + partial class ReDesingerDataStorage + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn) + .HasAnnotation("ProductVersion", "2.2.6-servicing-10079") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + modelBuilder.Entity("IoTSharp.Data.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ActionData") + .HasColumnType("jsonb"); + + b.Property("ActionName"); + + b.Property("ActionResult") + .HasColumnType("jsonb"); + + b.Property("ActiveDateTime"); + + b.Property("CustomerId"); + + b.Property("ObjectID"); + + b.Property("ObjectName"); + + b.Property("ObjectType"); + + b.Property("TenantId"); + + b.Property("UserId"); + + b.Property("UserName"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("TenantId"); + + b.ToTable("AuditLog"); + }); + + modelBuilder.Entity("IoTSharp.Data.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Address"); + + b.Property("City"); + + b.Property("Country"); + + b.Property("Email"); + + b.Property("Name"); + + b.Property("Phone"); + + b.Property("Province"); + + b.Property("Street"); + + b.Property("TenantId"); + + b.Property("ZipCode"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Customer"); + }); + + modelBuilder.Entity("IoTSharp.Data.DataStorage", b => + { + b.Property("Catalog"); + + b.Property("DeviceId"); + + b.Property("KeyName"); + + b.Property("DateTime"); + + b.Property("DataSide"); + + b.Property("Type"); + + b.Property("Value_Binary"); + + b.Property("Value_Boolean"); + + b.Property("Value_DateTime"); + + b.Property("Value_Double"); + + b.Property("Value_Json") + .HasColumnType("jsonb"); + + b.Property("Value_Long"); + + b.Property("Value_String"); + + b.Property("Value_XML") + .HasColumnType("xml"); + + b.HasKey("Catalog", "DeviceId", "KeyName", "DateTime"); + + b.HasIndex("Catalog"); + + b.HasIndex("Catalog", "DeviceId"); + + b.HasIndex("Catalog", "DeviceId", "KeyName"); + + b.HasIndex("Catalog", "DeviceId", "KeyName", "DateTime"); + + b.ToTable("DataStorage"); + + b.HasDiscriminator("Catalog").HasValue(0); + }); + + modelBuilder.Entity("IoTSharp.Data.Device", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CustomerId"); + + b.Property("DeviceType"); + + b.Property("Name"); + + b.Property("OwnerId"); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("TenantId"); + + b.ToTable("Device"); + + b.HasDiscriminator("DeviceType").HasValue(0); + }); + + modelBuilder.Entity("IoTSharp.Data.DeviceIdentity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DeviceId"); + + b.Property("IdentityId") + .IsRequired(); + + b.Property("IdentityType"); + + b.Property("IdentityValue"); + + b.HasKey("Id"); + + b.HasIndex("DeviceId"); + + b.ToTable("DeviceIdentities"); + }); + + modelBuilder.Entity("IoTSharp.Data.Relationship", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CustomerId"); + + b.Property("IdentityUserId"); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("IdentityUserId"); + + b.HasIndex("TenantId"); + + b.ToTable("Relationship"); + }); + + modelBuilder.Entity("IoTSharp.Data.RetainedMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Payload"); + + b.Property("QualityOfServiceLevel"); + + b.Property("Retain"); + + b.Property("Topic"); + + b.HasKey("Id"); + + b.ToTable("RetainedMessage"); + }); + + modelBuilder.Entity("IoTSharp.Data.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Address"); + + b.Property("City"); + + b.Property("Country"); + + b.Property("EMail"); + + b.Property("Name"); + + b.Property("Phone"); + + b.Property("Province"); + + b.Property("Street"); + + b.Property("ZipCode"); + + b.HasKey("Id"); + + b.ToTable("Tenant"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("IoTSharp.Data.AttributeData", b => + { + b.HasBaseType("IoTSharp.Data.DataStorage"); + + b.HasDiscriminator().HasValue(1); + }); + + modelBuilder.Entity("IoTSharp.Data.AttributeLatest", b => + { + b.HasBaseType("IoTSharp.Data.DataStorage"); + + b.HasDiscriminator().HasValue(2); + }); + + modelBuilder.Entity("IoTSharp.Data.TelemetryData", b => + { + b.HasBaseType("IoTSharp.Data.DataStorage"); + + b.HasDiscriminator().HasValue(3); + }); + + modelBuilder.Entity("IoTSharp.Data.TelemetryLatest", b => + { + b.HasBaseType("IoTSharp.Data.DataStorage"); + + b.HasDiscriminator().HasValue(4); + }); + + modelBuilder.Entity("IoTSharp.Data.Gateway", b => + { + b.HasBaseType("IoTSharp.Data.Device"); + + b.HasDiscriminator().HasValue(1); + }); + + modelBuilder.Entity("IoTSharp.Data.AuditLog", b => + { + b.HasOne("IoTSharp.Data.Customer", "Customer") + .WithMany() + .HasForeignKey("CustomerId"); + + b.HasOne("IoTSharp.Data.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("IoTSharp.Data.Customer", b => + { + b.HasOne("IoTSharp.Data.Tenant", "Tenant") + .WithMany("Customers") + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("IoTSharp.Data.Device", b => + { + b.HasOne("IoTSharp.Data.Customer", "Customer") + .WithMany("Devices") + .HasForeignKey("CustomerId"); + + b.HasOne("IoTSharp.Data.Gateway", "Owner") + .WithMany("Children") + .HasForeignKey("OwnerId"); + + b.HasOne("IoTSharp.Data.Tenant", "Tenant") + .WithMany("Devices") + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("IoTSharp.Data.DeviceIdentity", b => + { + b.HasOne("IoTSharp.Data.Device", "Device") + .WithMany() + .HasForeignKey("DeviceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("IoTSharp.Data.Relationship", b => + { + b.HasOne("IoTSharp.Data.Customer", "Customer") + .WithMany() + .HasForeignKey("CustomerId"); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "IdentityUser") + .WithMany() + .HasForeignKey("IdentityUserId"); + + b.HasOne("IoTSharp.Data.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/IoTSharp/Data/Migrations/20190903070558_ReDesingerDataStorage.cs b/IoTSharp/Data/Migrations/20190903070558_ReDesingerDataStorage.cs new file mode 100644 index 0000000000000000000000000000000000000000..f384a6d3abfc5882e40f63419914b99e63c5c9c5 --- /dev/null +++ b/IoTSharp/Data/Migrations/20190903070558_ReDesingerDataStorage.cs @@ -0,0 +1,202 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace IoTSharp.Migrations +{ + public partial class ReDesingerDataStorage : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_DataStorage_Device_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropForeignKey( + name: "FK_DataStorage_Device_AttributeLatest_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropForeignKey( + name: "FK_DataStorage_Device_TelemetryData_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropForeignKey( + name: "FK_DataStorage_Device_TelemetryLatest_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropPrimaryKey( + name: "PK_DataStorage", + table: "DataStorage"); + + migrationBuilder.DropIndex( + name: "IX_DataStorage_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropIndex( + name: "IX_DataStorage_AttributeLatest_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropIndex( + name: "IX_DataStorage_TelemetryData_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropIndex( + name: "IX_DataStorage_TelemetryLatest_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropColumn( + name: "AttributeLatest_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropColumn( + name: "Id", + table: "DataStorage"); + + migrationBuilder.DropColumn( + name: "TelemetryData_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropColumn( + name: "TelemetryLatest_DeviceId", + table: "DataStorage"); + + migrationBuilder.AlterColumn( + name: "DeviceId", + table: "DataStorage", + nullable: false, + oldClrType: typeof(Guid), + oldNullable: true); + + migrationBuilder.AddPrimaryKey( + name: "PK_DataStorage", + table: "DataStorage", + columns: new[] { "Catalog", "DeviceId", "KeyName", "DateTime" }); + + migrationBuilder.CreateIndex( + name: "IX_DataStorage_Catalog", + table: "DataStorage", + column: "Catalog"); + + migrationBuilder.CreateIndex( + name: "IX_DataStorage_Catalog_DeviceId", + table: "DataStorage", + columns: new[] { "Catalog", "DeviceId" }); + + migrationBuilder.CreateIndex( + name: "IX_DataStorage_Catalog_DeviceId_KeyName", + table: "DataStorage", + columns: new[] { "Catalog", "DeviceId", "KeyName" }); + + migrationBuilder.CreateIndex( + name: "IX_DataStorage_Catalog_DeviceId_KeyName_DateTime", + table: "DataStorage", + columns: new[] { "Catalog", "DeviceId", "KeyName", "DateTime" }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropPrimaryKey( + name: "PK_DataStorage", + table: "DataStorage"); + + migrationBuilder.DropIndex( + name: "IX_DataStorage_Catalog", + table: "DataStorage"); + + migrationBuilder.DropIndex( + name: "IX_DataStorage_Catalog_DeviceId", + table: "DataStorage"); + + migrationBuilder.DropIndex( + name: "IX_DataStorage_Catalog_DeviceId_KeyName", + table: "DataStorage"); + + migrationBuilder.DropIndex( + name: "IX_DataStorage_Catalog_DeviceId_KeyName_DateTime", + table: "DataStorage"); + + migrationBuilder.AlterColumn( + name: "DeviceId", + table: "DataStorage", + nullable: true, + oldClrType: typeof(Guid)); + + migrationBuilder.AddColumn( + name: "AttributeLatest_DeviceId", + table: "DataStorage", + nullable: true); + + migrationBuilder.AddColumn( + name: "Id", + table: "DataStorage", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000")); + + migrationBuilder.AddColumn( + name: "TelemetryData_DeviceId", + table: "DataStorage", + nullable: true); + + migrationBuilder.AddColumn( + name: "TelemetryLatest_DeviceId", + table: "DataStorage", + nullable: true); + + migrationBuilder.AddPrimaryKey( + name: "PK_DataStorage", + table: "DataStorage", + column: "Id"); + + migrationBuilder.CreateIndex( + name: "IX_DataStorage_DeviceId", + table: "DataStorage", + column: "DeviceId"); + + migrationBuilder.CreateIndex( + name: "IX_DataStorage_AttributeLatest_DeviceId", + table: "DataStorage", + column: "AttributeLatest_DeviceId"); + + migrationBuilder.CreateIndex( + name: "IX_DataStorage_TelemetryData_DeviceId", + table: "DataStorage", + column: "TelemetryData_DeviceId"); + + migrationBuilder.CreateIndex( + name: "IX_DataStorage_TelemetryLatest_DeviceId", + table: "DataStorage", + column: "TelemetryLatest_DeviceId"); + + migrationBuilder.AddForeignKey( + name: "FK_DataStorage_Device_DeviceId", + table: "DataStorage", + column: "DeviceId", + principalTable: "Device", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_DataStorage_Device_AttributeLatest_DeviceId", + table: "DataStorage", + column: "AttributeLatest_DeviceId", + principalTable: "Device", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_DataStorage_Device_TelemetryData_DeviceId", + table: "DataStorage", + column: "TelemetryData_DeviceId", + principalTable: "Device", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_DataStorage_Device_TelemetryLatest_DeviceId", + table: "DataStorage", + column: "TelemetryLatest_DeviceId", + principalTable: "Device", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/IoTSharp/Data/Migrations/20190903070959_ModifyColumnOrder.Designer.cs b/IoTSharp/Data/Migrations/20190903070959_ModifyColumnOrder.Designer.cs new file mode 100644 index 0000000000000000000000000000000000000000..506a24adcd677278ca633445daabbb460bf66deb --- /dev/null +++ b/IoTSharp/Data/Migrations/20190903070959_ModifyColumnOrder.Designer.cs @@ -0,0 +1,553 @@ +// +using System; +using IoTSharp.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace IoTSharp.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20190903070959_ModifyColumnOrder")] + partial class ModifyColumnOrder + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn) + .HasAnnotation("ProductVersion", "2.2.6-servicing-10079") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + modelBuilder.Entity("IoTSharp.Data.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ActionData") + .HasColumnType("jsonb"); + + b.Property("ActionName"); + + b.Property("ActionResult") + .HasColumnType("jsonb"); + + b.Property("ActiveDateTime"); + + b.Property("CustomerId"); + + b.Property("ObjectID"); + + b.Property("ObjectName"); + + b.Property("ObjectType"); + + b.Property("TenantId"); + + b.Property("UserId"); + + b.Property("UserName"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("TenantId"); + + b.ToTable("AuditLog"); + }); + + modelBuilder.Entity("IoTSharp.Data.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Address"); + + b.Property("City"); + + b.Property("Country"); + + b.Property("Email"); + + b.Property("Name"); + + b.Property("Phone"); + + b.Property("Province"); + + b.Property("Street"); + + b.Property("TenantId"); + + b.Property("ZipCode"); + + b.HasKey("Id"); + + b.HasIndex("TenantId"); + + b.ToTable("Customer"); + }); + + modelBuilder.Entity("IoTSharp.Data.DataStorage", b => + { + b.Property("Catalog"); + + b.Property("DeviceId"); + + b.Property("KeyName"); + + b.Property("DateTime"); + + b.Property("DataSide"); + + b.Property("Type"); + + b.Property("Value_Binary"); + + b.Property("Value_Boolean"); + + b.Property("Value_DateTime"); + + b.Property("Value_Double"); + + b.Property("Value_Json") + .HasColumnType("jsonb"); + + b.Property("Value_Long"); + + b.Property("Value_String"); + + b.Property("Value_XML") + .HasColumnType("xml"); + + b.HasKey("Catalog", "DeviceId", "KeyName", "DateTime"); + + b.HasIndex("Catalog"); + + b.HasIndex("Catalog", "DeviceId"); + + b.HasIndex("Catalog", "DeviceId", "KeyName"); + + b.HasIndex("Catalog", "DeviceId", "KeyName", "DateTime"); + + b.ToTable("DataStorage"); + + b.HasDiscriminator("Catalog").HasValue(0); + }); + + modelBuilder.Entity("IoTSharp.Data.Device", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CustomerId"); + + b.Property("DeviceType"); + + b.Property("Name"); + + b.Property("OwnerId"); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("OwnerId"); + + b.HasIndex("TenantId"); + + b.ToTable("Device"); + + b.HasDiscriminator("DeviceType").HasValue(0); + }); + + modelBuilder.Entity("IoTSharp.Data.DeviceIdentity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("DeviceId"); + + b.Property("IdentityId") + .IsRequired(); + + b.Property("IdentityType"); + + b.Property("IdentityValue"); + + b.HasKey("Id"); + + b.HasIndex("DeviceId"); + + b.ToTable("DeviceIdentities"); + }); + + modelBuilder.Entity("IoTSharp.Data.Relationship", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CustomerId"); + + b.Property("IdentityUserId"); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.HasIndex("IdentityUserId"); + + b.HasIndex("TenantId"); + + b.ToTable("Relationship"); + }); + + modelBuilder.Entity("IoTSharp.Data.RetainedMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Payload"); + + b.Property("QualityOfServiceLevel"); + + b.Property("Retain"); + + b.Property("Topic"); + + b.HasKey("Id"); + + b.ToTable("RetainedMessage"); + }); + + modelBuilder.Entity("IoTSharp.Data.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Address"); + + b.Property("City"); + + b.Property("Country"); + + b.Property("EMail"); + + b.Property("Name"); + + b.Property("Phone"); + + b.Property("Province"); + + b.Property("Street"); + + b.Property("ZipCode"); + + b.HasKey("Id"); + + b.ToTable("Tenant"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("IoTSharp.Data.AttributeData", b => + { + b.HasBaseType("IoTSharp.Data.DataStorage"); + + b.HasDiscriminator().HasValue(1); + }); + + modelBuilder.Entity("IoTSharp.Data.AttributeLatest", b => + { + b.HasBaseType("IoTSharp.Data.DataStorage"); + + b.HasDiscriminator().HasValue(2); + }); + + modelBuilder.Entity("IoTSharp.Data.TelemetryData", b => + { + b.HasBaseType("IoTSharp.Data.DataStorage"); + + b.HasDiscriminator().HasValue(3); + }); + + modelBuilder.Entity("IoTSharp.Data.TelemetryLatest", b => + { + b.HasBaseType("IoTSharp.Data.DataStorage"); + + b.HasDiscriminator().HasValue(4); + }); + + modelBuilder.Entity("IoTSharp.Data.Gateway", b => + { + b.HasBaseType("IoTSharp.Data.Device"); + + b.HasDiscriminator().HasValue(1); + }); + + modelBuilder.Entity("IoTSharp.Data.AuditLog", b => + { + b.HasOne("IoTSharp.Data.Customer", "Customer") + .WithMany() + .HasForeignKey("CustomerId"); + + b.HasOne("IoTSharp.Data.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("IoTSharp.Data.Customer", b => + { + b.HasOne("IoTSharp.Data.Tenant", "Tenant") + .WithMany("Customers") + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("IoTSharp.Data.Device", b => + { + b.HasOne("IoTSharp.Data.Customer", "Customer") + .WithMany("Devices") + .HasForeignKey("CustomerId"); + + b.HasOne("IoTSharp.Data.Gateway", "Owner") + .WithMany("Children") + .HasForeignKey("OwnerId"); + + b.HasOne("IoTSharp.Data.Tenant", "Tenant") + .WithMany("Devices") + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("IoTSharp.Data.DeviceIdentity", b => + { + b.HasOne("IoTSharp.Data.Device", "Device") + .WithMany() + .HasForeignKey("DeviceId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("IoTSharp.Data.Relationship", b => + { + b.HasOne("IoTSharp.Data.Customer", "Customer") + .WithMany() + .HasForeignKey("CustomerId"); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", "IdentityUser") + .WithMany() + .HasForeignKey("IdentityUserId"); + + b.HasOne("IoTSharp.Data.Tenant", "Tenant") + .WithMany() + .HasForeignKey("TenantId"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/IoTSharp/Data/Migrations/20190903070959_ModifyColumnOrder.cs b/IoTSharp/Data/Migrations/20190903070959_ModifyColumnOrder.cs new file mode 100644 index 0000000000000000000000000000000000000000..8e266d561523fc502e0a5bfd12026e979732262b --- /dev/null +++ b/IoTSharp/Data/Migrations/20190903070959_ModifyColumnOrder.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace IoTSharp.Migrations +{ + public partial class ModifyColumnOrder : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/IoTSharp/Data/Migrations/ApplicationDbContextModelSnapshot.cs b/IoTSharp/Data/Migrations/ApplicationDbContextModelSnapshot.cs index 4805937cc8a2f31fc86a5144ef150fe8cef8ecc1..cda109f240c537217b2d1507032db57779f51d6c 100644 --- a/IoTSharp/Data/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/IoTSharp/Data/Migrations/ApplicationDbContextModelSnapshot.cs @@ -16,7 +16,7 @@ namespace IoTSharp.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn) - .HasAnnotation("ProductVersion", "2.2.4-servicing-10062") + .HasAnnotation("ProductVersion", "2.2.6-servicing-10079") .HasAnnotation("Relational:MaxIdentifierLength", 63); modelBuilder.Entity("IoTSharp.Data.AuditLog", b => @@ -91,17 +91,15 @@ namespace IoTSharp.Migrations modelBuilder.Entity("IoTSharp.Data.DataStorage", b => { - b.Property("Id") - .ValueGeneratedOnAdd(); - b.Property("Catalog"); - b.Property("DataSide"); + b.Property("DeviceId"); + + b.Property("KeyName"); b.Property("DateTime"); - b.Property("KeyName") - .IsRequired(); + b.Property("DataSide"); b.Property("Type"); @@ -123,7 +121,15 @@ namespace IoTSharp.Migrations b.Property("Value_XML") .HasColumnType("xml"); - b.HasKey("Id"); + b.HasKey("Catalog", "DeviceId", "KeyName", "DateTime"); + + b.HasIndex("Catalog"); + + b.HasIndex("Catalog", "DeviceId"); + + b.HasIndex("Catalog", "DeviceId", "KeyName"); + + b.HasIndex("Catalog", "DeviceId", "KeyName", "DateTime"); b.ToTable("DataStorage"); @@ -408,10 +414,6 @@ namespace IoTSharp.Migrations { b.HasBaseType("IoTSharp.Data.DataStorage"); - b.Property("DeviceId"); - - b.HasIndex("DeviceId"); - b.HasDiscriminator().HasValue(1); }); @@ -419,11 +421,6 @@ namespace IoTSharp.Migrations { b.HasBaseType("IoTSharp.Data.DataStorage"); - b.Property("DeviceId") - .HasColumnName("AttributeLatest_DeviceId"); - - b.HasIndex("DeviceId"); - b.HasDiscriminator().HasValue(2); }); @@ -431,11 +428,6 @@ namespace IoTSharp.Migrations { b.HasBaseType("IoTSharp.Data.DataStorage"); - b.Property("DeviceId") - .HasColumnName("TelemetryData_DeviceId"); - - b.HasIndex("DeviceId"); - b.HasDiscriminator().HasValue(3); }); @@ -443,11 +435,6 @@ namespace IoTSharp.Migrations { b.HasBaseType("IoTSharp.Data.DataStorage"); - b.Property("DeviceId") - .HasColumnName("TelemetryLatest_DeviceId"); - - b.HasIndex("DeviceId"); - b.HasDiscriminator().HasValue(4); }); @@ -558,38 +545,6 @@ namespace IoTSharp.Migrations .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); - - modelBuilder.Entity("IoTSharp.Data.AttributeData", b => - { - b.HasOne("IoTSharp.Data.Device", "Device") - .WithMany("AttributeData") - .HasForeignKey("DeviceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("IoTSharp.Data.AttributeLatest", b => - { - b.HasOne("IoTSharp.Data.Device", "Device") - .WithMany("AttributeLatest") - .HasForeignKey("DeviceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("IoTSharp.Data.TelemetryData", b => - { - b.HasOne("IoTSharp.Data.Device", "Device") - .WithMany("TelemetryData") - .HasForeignKey("DeviceId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("IoTSharp.Data.TelemetryLatest", b => - { - b.HasOne("IoTSharp.Data.Device", "Device") - .WithMany("TelemetryLatest") - .HasForeignKey("DeviceId") - .OnDelete(DeleteBehavior.Cascade); - }); #pragma warning restore 612, 618 } } diff --git a/IoTSharp/Extensions/DataExtension.cs b/IoTSharp/Extensions/DataExtension.cs index 85b6e6c6ff211369558a3575235d340aeded8481..54467b788ef62d3185977cd4a0bbc585f145a209 100644 --- a/IoTSharp/Extensions/DataExtension.cs +++ b/IoTSharp/Extensions/DataExtension.cs @@ -54,14 +54,13 @@ namespace IoTSharp.Extensions { try { - var tdata = new D() { DateTime = DateTime.Now, Device = device, Id = Guid.NewGuid(), KeyName = kp.Key }; + var tdata = new D() { DateTime = DateTime.Now, DeviceId = device.Id, KeyName = kp.Key }; if (kp.Key != null) { tdata.FillKVToMe(kp); - tdata.Id = Guid.NewGuid(); _context.Set().Add(tdata); } - var tl = _context.Set().FirstOrDefault(tx => tx.Device.Id == device.Id && tx.KeyName == kp.Key && tx.DataSide==dataSide); + var tl = _context.Set().FirstOrDefault(tx => tx.DeviceId == device.Id && tx.KeyName == kp.Key && tx.DataSide==dataSide); if (tl != null) { tl.FillKVToMe(kp); @@ -69,7 +68,7 @@ namespace IoTSharp.Extensions } else { - var t2 = new L() { DateTime = DateTime.Now, Device = device, Id = Guid.NewGuid(), KeyName = kp.Key, DataSide = dataSide }; + var t2 = new L() { DateTime = DateTime.Now, DeviceId = device.Id, KeyName = kp.Key, DataSide = dataSide }; t2.FillKVToMe(kp); _context.Set().Add(t2); } diff --git a/IoTSharp/Handlers/MQTTServerHandler.cs b/IoTSharp/Handlers/MQTTServerHandler.cs index 6abf81408e372bb7853115aeb6eeb0c80fa91387..c919e7983c26a7541c0be3bb7995740633445028 100644 --- a/IoTSharp/Handlers/MQTTServerHandler.cs +++ b/IoTSharp/Handlers/MQTTServerHandler.cs @@ -206,7 +206,7 @@ namespace IoTSharp.Handlers { if (Enum.TryParse(kx.Key, true, out DataSide ds)) { - var qf = from at in _dbContext.AttributeLatest.Include(al => al.Device) where at.Device == device && keys.Contains(at.KeyName) select at; + var qf = from at in _dbContext.AttributeLatest where at.DeviceId == device.Id && keys.Contains(at.KeyName) select at; await qf.LoadAsync(); if (ds == DataSide.AnySide) {