Changed Drives property on Device entity to use value conversion instead of foreign key.

This commit is contained in:
Jared Goodwin 2019-04-03 21:05:31 -07:00
parent 31fb1b6c6c
commit 2116a27565
9 changed files with 634 additions and 68 deletions

View File

@ -14,7 +14,7 @@ namespace Remotely_Library.Models
public class Device
{
public string CurrentUser { get; set; }
public virtual ICollection<Drive> Drives { get; set; }
public List<Drive> Drives { get; set; }
public double FreeMemory { get; set; }

View File

@ -8,15 +8,12 @@ namespace Remotely_Library.Models
{
public class Drive
{
[Key]
public string ID { get; set; } = Guid.NewGuid().ToString();
public DriveType DriveType { get; set; }
public string RootDirectory { get; internal set; }
public string Name { get; internal set; }
public string DriveFormat { get; internal set; }
public double FreeSpace { get; internal set; }
public double TotalSize { get; internal set; }
public string VolumeLabel { get; internal set; }
public string DeviceID { get; set; }
public string RootDirectory { get; set; }
public string Name { get; set; }
public string DriveFormat { get; set; }
public double FreeSpace { get; set; }
public double TotalSize { get; set; }
public string VolumeLabel { get; set; }
}
}

View File

@ -1 +1 @@
2019.04.03.1717
2019.04.03.2058

View File

@ -18,8 +18,6 @@ namespace Remotely_Server.Data
public DbSet<CommandContext> CommandContexts { get; set; }
public DbSet<Drive> Drives { get; set; }
public DbSet<Device> Devices { get; set; }
public DbSet<Organization> Organizations { get; set; }
@ -88,7 +86,10 @@ namespace Remotely_Server.Data
.HasOne(x => x.Organization);
builder.Entity<Device>()
.HasMany(x => x.Drives);
.Property(x => x.Drives)
.HasConversion(
x => JsonConvert.SerializeObject(x),
x => JsonConvert.DeserializeObject<List<Drive>>(x));
builder.Entity<UserPermissionLink>()

View File

@ -156,7 +156,6 @@ namespace Remotely_Server.Data
var result = RemotelyContext.Devices
.Include(x => x.DevicePermissionLinks)
.Include(x => x.Drives)
.Where(x => x.OrganizationID == user.OrganizationID);
if (user.IsAdministrator)
@ -215,7 +214,6 @@ namespace Remotely_Server.Data
var result = RemotelyContext.Devices
.Include(x => x.DevicePermissionLinks)
.Include(x => x.Drives)
.Where(x =>
x.OrganizationID == user.OrganizationID &&
x.ID == deviceID);
@ -275,17 +273,8 @@ namespace Remotely_Server.Data
public void RemoveDevices(string[] deviceIDs)
{
var devices = RemotelyContext.Devices
.Include(x => x.Drives)
.Where(x => deviceIDs.Contains(x.ID));
foreach (var device in devices)
{
if (device?.Drives?.Count > 0)
{
RemotelyContext.Drives.RemoveRange(device.Drives);
}
RemotelyContext.Devices.Remove(device);
}
RemotelyContext.Devices.RemoveRange(devices);
RemotelyContext.SaveChanges();
}

View File

@ -0,0 +1,559 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Remotely_Server.Data;
namespace Remotely_Server.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20190404021415_DrivesValuesConversion")]
partial class DrivesValuesConversion
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.3-servicing-35854");
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken();
b.Property<string>("Name")
.HasMaxLength(256);
b.Property<string>("NormalizedName")
.HasMaxLength(256);
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasName("RoleNameIndex");
b.ToTable("AspNetRoles");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("ClaimType");
b.Property<string>("ClaimValue");
b.Property<string>("RoleId")
.IsRequired();
b.HasKey("Id");
b.HasIndex("RoleId");
b.ToTable("AspNetRoleClaims");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd();
b.Property<int>("AccessFailedCount");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken();
b.Property<string>("Discriminator")
.IsRequired();
b.Property<string>("Email")
.HasMaxLength(256);
b.Property<bool>("EmailConfirmed");
b.Property<bool>("LockoutEnabled");
b.Property<DateTimeOffset?>("LockoutEnd");
b.Property<string>("NormalizedEmail")
.HasMaxLength(256);
b.Property<string>("NormalizedUserName")
.HasMaxLength(256);
b.Property<string>("PasswordHash");
b.Property<string>("PhoneNumber");
b.Property<bool>("PhoneNumberConfirmed");
b.Property<string>("SecurityStamp");
b.Property<bool>("TwoFactorEnabled");
b.Property<string>("UserName")
.HasMaxLength(256);
b.HasKey("Id");
b.HasIndex("NormalizedEmail")
.HasName("EmailIndex");
b.HasIndex("NormalizedUserName")
.IsUnique()
.HasName("UserNameIndex");
b.ToTable("RemotelyUsers");
b.HasDiscriminator<string>("Discriminator").HasValue("IdentityUser");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("ClaimType");
b.Property<string>("ClaimValue");
b.Property<string>("UserId")
.IsRequired();
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("AspNetUserClaims");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.Property<string>("LoginProvider")
.HasMaxLength(128);
b.Property<string>("ProviderKey")
.HasMaxLength(128);
b.Property<string>("ProviderDisplayName");
b.Property<string>("UserId")
.IsRequired();
b.HasKey("LoginProvider", "ProviderKey");
b.HasIndex("UserId");
b.ToTable("AspNetUserLogins");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
{
b.Property<string>("UserId");
b.Property<string>("RoleId");
b.HasKey("UserId", "RoleId");
b.HasIndex("RoleId");
b.ToTable("AspNetUserRoles");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
{
b.Property<string>("UserId");
b.Property<string>("LoginProvider")
.HasMaxLength(128);
b.Property<string>("Name")
.HasMaxLength(128);
b.Property<string>("Value");
b.HasKey("UserId", "LoginProvider", "Name");
b.ToTable("AspNetUserTokens");
});
modelBuilder.Entity("Remotely_Library.Models.CommandContext", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("CommandMode");
b.Property<string>("CommandResults");
b.Property<string>("CommandText");
b.Property<string>("OrganizationID");
b.Property<string>("PSCoreResults");
b.Property<string>("SenderConnectionID");
b.Property<string>("SenderUserID");
b.Property<string>("TargetDeviceIDs");
b.Property<DateTime>("TimeStamp");
b.HasKey("ID");
b.HasIndex("OrganizationID");
b.ToTable("CommandContexts");
});
modelBuilder.Entity("Remotely_Library.Models.Device", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("CurrentUser");
b.Property<string>("DeviceName");
b.Property<string>("Drives");
b.Property<double>("FreeMemory");
b.Property<double>("FreeStorage");
b.Property<bool>("Is64Bit");
b.Property<bool>("IsOnline");
b.Property<DateTime>("LastOnline");
b.Property<int>("OSArchitecture");
b.Property<string>("OSDescription");
b.Property<string>("OrganizationID");
b.Property<string>("Platform");
b.Property<int>("ProcessorCount");
b.Property<string>("ServerVerificationToken");
b.Property<string>("Tags")
.HasMaxLength(200);
b.Property<double>("TotalMemory");
b.Property<double>("TotalStorage");
b.HasKey("ID");
b.HasIndex("OrganizationID");
b.ToTable("Devices");
});
modelBuilder.Entity("Remotely_Library.Models.DevicePermissionLink", b =>
{
b.Property<string>("PermissionGroupID");
b.Property<string>("DeviceID");
b.HasKey("PermissionGroupID", "DeviceID");
b.HasIndex("DeviceID");
b.ToTable("DevicePermissionLinks");
});
modelBuilder.Entity("Remotely_Library.Models.EventLog", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<int>("EventType");
b.Property<string>("Message");
b.Property<string>("OrganizationID");
b.Property<string>("Source");
b.Property<string>("StackTrace");
b.Property<DateTime>("TimeStamp");
b.HasKey("ID");
b.HasIndex("OrganizationID");
b.ToTable("EventLogs");
});
modelBuilder.Entity("Remotely_Library.Models.InviteLink", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<DateTime>("DateSent");
b.Property<string>("InvitedUser");
b.Property<bool>("IsAdmin");
b.Property<string>("OrganizationID");
b.HasKey("ID");
b.HasIndex("OrganizationID");
b.ToTable("InviteLinks");
});
modelBuilder.Entity("Remotely_Library.Models.Organization", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("OrganizationName")
.HasMaxLength(25);
b.HasKey("ID");
b.ToTable("Organizations");
});
modelBuilder.Entity("Remotely_Library.Models.PermissionGroup", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("Name")
.HasMaxLength(100);
b.Property<string>("OrganizationID");
b.HasKey("ID");
b.HasIndex("OrganizationID");
b.ToTable("PermissionGroups");
});
modelBuilder.Entity("Remotely_Library.Models.RemotelyUserOptions", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("CommandModeShortcutBash")
.HasMaxLength(10);
b.Property<string>("CommandModeShortcutCMD")
.HasMaxLength(10);
b.Property<string>("CommandModeShortcutPSCore")
.HasMaxLength(10);
b.Property<string>("CommandModeShortcutWeb")
.HasMaxLength(10);
b.Property<string>("CommandModeShortcutWinPS")
.HasMaxLength(10);
b.Property<string>("ConsolePrompt")
.HasMaxLength(5);
b.HasKey("ID");
b.ToTable("RemotelyUserOptions");
});
modelBuilder.Entity("Remotely_Library.Models.SharedFile", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("ContentType");
b.Property<byte[]>("FileContents");
b.Property<string>("FileName");
b.Property<string>("OrganizationID");
b.Property<DateTime>("Timestamp");
b.HasKey("ID");
b.HasIndex("OrganizationID");
b.ToTable("SharedFiles");
});
modelBuilder.Entity("Remotely_Library.Models.UserPermissionLink", b =>
{
b.Property<string>("PermissionGroupID");
b.Property<string>("RemotelyUserID");
b.HasKey("PermissionGroupID", "RemotelyUserID");
b.HasIndex("RemotelyUserID");
b.ToTable("UserPermissionLinks");
});
modelBuilder.Entity("Remotely_Library.Models.RemotelyUser", b =>
{
b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser");
b.Property<bool>("IsAdministrator");
b.Property<string>("OrganizationID");
b.Property<string>("UserOptionsID");
b.HasIndex("OrganizationID");
b.HasIndex("UserOptionsID");
b.ToTable("RemotelyUsers");
b.HasDiscriminator().HasValue("RemotelyUser");
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole")
.WithMany()
.HasForeignKey("RoleId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", 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<string>", b =>
{
b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("Remotely_Library.Models.CommandContext", b =>
{
b.HasOne("Remotely_Library.Models.Organization", "Organization")
.WithMany("CommandContexts")
.HasForeignKey("OrganizationID");
});
modelBuilder.Entity("Remotely_Library.Models.Device", b =>
{
b.HasOne("Remotely_Library.Models.Organization", "Organization")
.WithMany("Devices")
.HasForeignKey("OrganizationID");
});
modelBuilder.Entity("Remotely_Library.Models.DevicePermissionLink", b =>
{
b.HasOne("Remotely_Library.Models.Device", "Device")
.WithMany("DevicePermissionLinks")
.HasForeignKey("DeviceID")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("Remotely_Library.Models.PermissionGroup", "PermissionGroup")
.WithMany("DevicePermissionLinks")
.HasForeignKey("PermissionGroupID")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("Remotely_Library.Models.EventLog", b =>
{
b.HasOne("Remotely_Library.Models.Organization", "Organization")
.WithMany("EventLogs")
.HasForeignKey("OrganizationID");
});
modelBuilder.Entity("Remotely_Library.Models.InviteLink", b =>
{
b.HasOne("Remotely_Library.Models.Organization", "Organization")
.WithMany("InviteLinks")
.HasForeignKey("OrganizationID");
});
modelBuilder.Entity("Remotely_Library.Models.PermissionGroup", b =>
{
b.HasOne("Remotely_Library.Models.Organization", "Organization")
.WithMany("PermissionGroups")
.HasForeignKey("OrganizationID");
});
modelBuilder.Entity("Remotely_Library.Models.SharedFile", b =>
{
b.HasOne("Remotely_Library.Models.Organization", "Organization")
.WithMany("SharedFiles")
.HasForeignKey("OrganizationID");
});
modelBuilder.Entity("Remotely_Library.Models.UserPermissionLink", b =>
{
b.HasOne("Remotely_Library.Models.PermissionGroup", "PermissionGroup")
.WithMany("UserPermissionLinks")
.HasForeignKey("PermissionGroupID")
.OnDelete(DeleteBehavior.Cascade);
b.HasOne("Remotely_Library.Models.RemotelyUser", "RemotelyUser")
.WithMany("UserPermissionLinks")
.HasForeignKey("RemotelyUserID")
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("Remotely_Library.Models.RemotelyUser", b =>
{
b.HasOne("Remotely_Library.Models.Organization", "Organization")
.WithMany("RemotelyUsers")
.HasForeignKey("OrganizationID");
b.HasOne("Remotely_Library.Models.RemotelyUserOptions", "UserOptions")
.WithMany()
.HasForeignKey("UserOptionsID");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,55 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Remotely_Server.Migrations
{
public partial class DrivesValuesConversion : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Drives");
migrationBuilder.AddColumn<string>(
name: "Drives",
table: "Devices",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Drives",
table: "Devices");
migrationBuilder.CreateTable(
name: "Drives",
columns: table => new
{
ID = table.Column<string>(nullable: false),
DeviceID = table.Column<string>(nullable: true),
DriveFormat = table.Column<string>(nullable: true),
DriveType = table.Column<int>(nullable: false),
FreeSpace = table.Column<double>(nullable: false),
Name = table.Column<string>(nullable: true),
RootDirectory = table.Column<string>(nullable: true),
TotalSize = table.Column<double>(nullable: false),
VolumeLabel = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Drives", x => x.ID);
table.ForeignKey(
name: "FK_Drives_Devices_DeviceID",
column: x => x.DeviceID,
principalTable: "Devices",
principalColumn: "ID",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_Drives_DeviceID",
table: "Drives",
column: "DeviceID");
}
}
}

View File

@ -221,6 +221,8 @@ namespace Remotely_Server.Migrations
b.Property<string>("DeviceName");
b.Property<string>("Drives");
b.Property<double>("FreeMemory");
b.Property<double>("FreeStorage");
@ -270,34 +272,6 @@ namespace Remotely_Server.Migrations
b.ToTable("DevicePermissionLinks");
});
modelBuilder.Entity("Remotely_Library.Models.Drive", b =>
{
b.Property<string>("ID")
.ValueGeneratedOnAdd();
b.Property<string>("DeviceID");
b.Property<string>("DriveFormat");
b.Property<int>("DriveType");
b.Property<double>("FreeSpace");
b.Property<string>("Name");
b.Property<string>("RootDirectory");
b.Property<double>("TotalSize");
b.Property<string>("VolumeLabel");
b.HasKey("ID");
b.HasIndex("DeviceID");
b.ToTable("Drives");
});
modelBuilder.Entity("Remotely_Library.Models.EventLog", b =>
{
b.Property<string>("ID")
@ -526,13 +500,6 @@ namespace Remotely_Server.Migrations
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("Remotely_Library.Models.Drive", b =>
{
b.HasOne("Remotely_Library.Models.Device")
.WithMany("Drives")
.HasForeignKey("DeviceID");
});
modelBuilder.Entity("Remotely_Library.Models.EventLog", b =>
{
b.HasOne("Remotely_Library.Models.Organization", "Organization")

View File

@ -102,8 +102,7 @@ namespace Remotely_Server
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
options.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});
services.AddSignalR(options =>
@ -113,7 +112,7 @@ namespace Remotely_Server
.AddJsonProtocol(options =>
{
options.PayloadSerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
options.PayloadSerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
options.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
})
.AddMessagePackProtocol();
@ -205,11 +204,10 @@ namespace Remotely_Server
private void ConfigureStaticFiles(IApplicationBuilder app)
{
Newtonsoft.Json.JsonConvert.DefaultSettings = () =>
JsonConvert.DefaultSettings = () =>
{
var settings = new Newtonsoft.Json.JsonSerializerSettings();
settings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
settings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
var settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
return settings;
};
var provider = new FileExtensionContentTypeProvider();