From 5a0714e795b33493a2049f4d81d524be2ff83c5f Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 24 Dec 2018 21:13:02 +0000 Subject: [PATCH] Fix USB IDs and indexes in databases. --- .../.idea/contentModel.xml | 15 + .../DiscImageChef.Database.csproj | 2 + ...1224172147_FixUsbIdsAndIndexes.Designer.cs | 1407 +++++++++++++++++ .../20181224172147_FixUsbIdsAndIndexes.cs | 21 + .../Migrations/DicContextModelSnapshot.cs | 6 + DiscImageChef.Database/Models/UsbProduct.cs | 18 +- DiscImageChef.Database/Models/UsbVendor.cs | 8 +- .../DiscImageChef.Server.csproj | 7 + ...2241719441_FixUsbIdsAndIndexes.Designer.cs | 29 + .../201812241719441_FixUsbIdsAndIndexes.cs | 25 + .../201812241719441_FixUsbIdsAndIndexes.resx | 126 ++ DiscImageChef.Server/Models/UsbProduct.cs | 21 +- DiscImageChef.Server/Models/UsbVendor.cs | 12 +- 13 files changed, 1673 insertions(+), 24 deletions(-) create mode 100644 DiscImageChef.Database/Migrations/20181224172147_FixUsbIdsAndIndexes.Designer.cs create mode 100644 DiscImageChef.Database/Migrations/20181224172147_FixUsbIdsAndIndexes.cs create mode 100644 DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs create mode 100644 DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index 053ecb365..76cd5fc01 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -137,6 +137,7 @@ + @@ -319,6 +320,10 @@ + + + + @@ -332,6 +337,8 @@ + + @@ -1808,6 +1815,12 @@ + + + + + + @@ -1822,6 +1835,8 @@ + + diff --git a/DiscImageChef.Database/DiscImageChef.Database.csproj b/DiscImageChef.Database/DiscImageChef.Database.csproj index 042170388..885cd04f1 100644 --- a/DiscImageChef.Database/DiscImageChef.Database.csproj +++ b/DiscImageChef.Database/DiscImageChef.Database.csproj @@ -82,6 +82,8 @@ + + diff --git a/DiscImageChef.Database/Migrations/20181224172147_FixUsbIdsAndIndexes.Designer.cs b/DiscImageChef.Database/Migrations/20181224172147_FixUsbIdsAndIndexes.Designer.cs new file mode 100644 index 000000000..3778e2ff0 --- /dev/null +++ b/DiscImageChef.Database/Migrations/20181224172147_FixUsbIdsAndIndexes.Designer.cs @@ -0,0 +1,1407 @@ +// +using System; +using DiscImageChef.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace DiscImageChef.Database.Migrations +{ + [DbContext(typeof(DicContext))] + [Migration("20181224172147_FixUsbIdsAndIndexes")] + partial class FixUsbIdsAndIndexes + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.4-rtm-31024"); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ata", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Identify"); + + b.Property("ReadCapabilitiesId"); + + b.HasKey("Id"); + + b.HasIndex("ReadCapabilitiesId"); + + b.ToTable("Ata"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.BlockDescriptor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlockLength"); + + b.Property("BlockLengthSql"); + + b.Property("Blocks"); + + b.Property("BlocksSql"); + + b.Property("Density"); + + b.Property("ScsiModeId"); + + b.HasKey("Id"); + + b.HasIndex("ScsiModeId"); + + b.ToTable("BlockDescriptor"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Chs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Cylinders"); + + b.Property("CylindersSql"); + + b.Property("Heads"); + + b.Property("HeadsSql"); + + b.Property("Sectors"); + + b.Property("SectorsSql"); + + b.HasKey("Id"); + + b.ToTable("Chs"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.DensityCode", b => + { + b.Property("Code") + .ValueGeneratedOnAdd(); + + b.Property("SscSupportedMediaId"); + + b.HasKey("Code"); + + b.HasIndex("SscSupportedMediaId"); + + b.ToTable("DensityCode"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.FireWire", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Manufacturer"); + + b.Property("Product"); + + b.Property("ProductID"); + + b.Property("ProductIDSql"); + + b.Property("RemovableMedia"); + + b.Property("VendorID"); + + b.Property("VendorIDSql"); + + b.HasKey("Id"); + + b.ToTable("FireWire"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Mmc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("FeaturesId"); + + b.Property("ModeSense2AData"); + + b.HasKey("Id"); + + b.HasIndex("FeaturesId"); + + b.ToTable("Mmc"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.MmcFeatures", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AACSVersion"); + + b.Property("AGIDs"); + + b.Property("BindingNonceBlocks"); + + b.Property("BlocksPerReadableUnit"); + + b.Property("BlocksPerReadableUnitSql"); + + b.Property("BufferUnderrunFreeInDVD"); + + b.Property("BufferUnderrunFreeInSAO"); + + b.Property("BufferUnderrunFreeInTAO"); + + b.Property("CPRMVersion"); + + b.Property("CSSVersion"); + + b.Property("CanAudioScan"); + + b.Property("CanEject"); + + b.Property("CanEraseSector"); + + b.Property("CanExpandBDRESpareArea"); + + b.Property("CanFormat"); + + b.Property("CanFormatBDREWithoutSpare"); + + b.Property("CanFormatCert"); + + b.Property("CanFormatFRF"); + + b.Property("CanFormatQCert"); + + b.Property("CanFormatRRM"); + + b.Property("CanGenerateBindingNonce"); + + b.Property("CanLoad"); + + b.Property("CanMuteSeparateChannels"); + + b.Property("CanOverwriteSAOTrack"); + + b.Property("CanOverwriteTAOTrack"); + + b.Property("CanPlayCDAudio"); + + b.Property("CanPseudoOverwriteBDR"); + + b.Property("CanReadAllDualR"); + + b.Property("CanReadAllDualRW"); + + b.Property("CanReadBD"); + + b.Property("CanReadBDR"); + + b.Property("CanReadBDRE1"); + + b.Property("CanReadBDRE2"); + + b.Property("CanReadBDROM"); + + b.Property("CanReadBluBCA"); + + b.Property("CanReadCD"); + + b.Property("CanReadCDMRW"); + + b.Property("CanReadCPRM_MKB"); + + b.Property("CanReadDDCD"); + + b.Property("CanReadDVD"); + + b.Property("CanReadDVDPlusMRW"); + + b.Property("CanReadDVDPlusR"); + + b.Property("CanReadDVDPlusRDL"); + + b.Property("CanReadDVDPlusRW"); + + b.Property("CanReadDVDPlusRWDL"); + + b.Property("CanReadDriveAACSCertificate"); + + b.Property("CanReadHDDVD"); + + b.Property("CanReadHDDVDR"); + + b.Property("CanReadHDDVDRAM"); + + b.Property("CanReadLeadInCDText"); + + b.Property("CanReadOldBDR"); + + b.Property("CanReadOldBDRE"); + + b.Property("CanReadOldBDROM"); + + b.Property("CanReadSpareAreaInformation"); + + b.Property("CanReportDriveSerial"); + + b.Property("CanReportMediaSerial"); + + b.Property("CanTestWriteDDCDR"); + + b.Property("CanTestWriteDVD"); + + b.Property("CanTestWriteInSAO"); + + b.Property("CanTestWriteInTAO"); + + b.Property("CanUpgradeFirmware"); + + b.Property("CanWriteBD"); + + b.Property("CanWriteBDR"); + + b.Property("CanWriteBDRE1"); + + b.Property("CanWriteBDRE2"); + + b.Property("CanWriteBusEncryptedBlocks"); + + b.Property("CanWriteCDMRW"); + + b.Property("CanWriteCDRW"); + + b.Property("CanWriteCDRWCAV"); + + b.Property("CanWriteCDSAO"); + + b.Property("CanWriteCDTAO"); + + b.Property("CanWriteCSSManagedDVD"); + + b.Property("CanWriteDDCDR"); + + b.Property("CanWriteDDCDRW"); + + b.Property("CanWriteDVDPlusMRW"); + + b.Property("CanWriteDVDPlusR"); + + b.Property("CanWriteDVDPlusRDL"); + + b.Property("CanWriteDVDPlusRW"); + + b.Property("CanWriteDVDPlusRWDL"); + + b.Property("CanWriteDVDR"); + + b.Property("CanWriteDVDRDL"); + + b.Property("CanWriteDVDRW"); + + b.Property("CanWriteHDDVDR"); + + b.Property("CanWriteHDDVDRAM"); + + b.Property("CanWriteOldBDR"); + + b.Property("CanWriteOldBDRE"); + + b.Property("CanWritePackedSubchannelInTAO"); + + b.Property("CanWriteRWSubchannelInSAO"); + + b.Property("CanWriteRWSubchannelInTAO"); + + b.Property("CanWriteRaw"); + + b.Property("CanWriteRawMultiSession"); + + b.Property("CanWriteRawSubchannelInTAO"); + + b.Property("ChangerIsSideChangeCapable"); + + b.Property("ChangerSlots"); + + b.Property("ChangerSupportsDiscPresent"); + + b.Property("DBML"); + + b.Property("DVDMultiRead"); + + b.Property("EmbeddedChanger"); + + b.Property("ErrorRecoveryPage"); + + b.Property("FirmwareDate"); + + b.Property("LoadingMechanismType"); + + b.Property("Locked"); + + b.Property("LogicalBlockSize"); + + b.Property("LogicalBlockSizeSql"); + + b.Property("MultiRead"); + + b.Property("PhysicalInterfaceStandardNumber"); + + b.Property("PhysicalInterfaceStandardNumberSql"); + + b.Property("PreventJumper"); + + b.Property("SupportsAACS"); + + b.Property("SupportsBusEncryption"); + + b.Property("SupportsC2"); + + b.Property("SupportsCPRM"); + + b.Property("SupportsCSS"); + + b.Property("SupportsDAP"); + + b.Property("SupportsDeviceBusyEvent"); + + b.Property("SupportsHybridDiscs"); + + b.Property("SupportsModePage1Ch"); + + b.Property("SupportsOSSC"); + + b.Property("SupportsPWP"); + + b.Property("SupportsSWPP"); + + b.Property("SupportsSecurDisc"); + + b.Property("SupportsSeparateVolume"); + + b.Property("SupportsVCPS"); + + b.Property("SupportsWriteInhibitDCB"); + + b.Property("SupportsWriteProtectPAC"); + + b.Property("VolumeLevels"); + + b.Property("VolumeLevelsSql"); + + b.HasKey("Id"); + + b.ToTable("MmcFeatures"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.MmcSd", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CID"); + + b.Property("CSD"); + + b.Property("ExtendedCSD"); + + b.Property("OCR"); + + b.Property("SCR"); + + b.HasKey("Id"); + + b.ToTable("MmcSd"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Pcmcia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CIS"); + + b.Property("CardCode"); + + b.Property("CardCodeSql"); + + b.Property("Compliance"); + + b.Property("Manufacturer"); + + b.Property("ManufacturerCode"); + + b.Property("ManufacturerCodeSql"); + + b.Property("ProductName"); + + b.HasKey("Id"); + + b.ToTable("Pcmcia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Scsi", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("InquiryData"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("ModeSenseId"); + + b.Property("MultiMediaDeviceId"); + + b.Property("ReadCapabilitiesId"); + + b.Property("SequentialDeviceId"); + + b.Property("SupportsModeSense10"); + + b.Property("SupportsModeSense6"); + + b.Property("SupportsModeSubpages"); + + b.HasKey("Id"); + + b.HasIndex("ModeSenseId"); + + b.HasIndex("MultiMediaDeviceId"); + + b.HasIndex("ReadCapabilitiesId"); + + b.HasIndex("SequentialDeviceId"); + + b.ToTable("Scsi"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiMode", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlankCheckEnabled"); + + b.Property("BufferedMode"); + + b.Property("DPOandFUA"); + + b.Property("MediumType"); + + b.Property("Speed"); + + b.Property("WriteProtected"); + + b.HasKey("Id"); + + b.ToTable("ScsiMode"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiPage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ScsiId"); + + b.Property("ScsiModeId"); + + b.Property("page"); + + b.Property("subpage"); + + b.Property("value"); + + b.HasKey("Id"); + + b.HasIndex("ScsiId"); + + b.HasIndex("ScsiModeId"); + + b.ToTable("ScsiPage"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ssc", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BlockSizeGranularity"); + + b.Property("MaxBlockLength"); + + b.Property("MaxBlockLengthSql"); + + b.Property("MinBlockLength"); + + b.Property("MinBlockLengthSql"); + + b.HasKey("Id"); + + b.ToTable("Ssc"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Description"); + + b.Property("Length"); + + b.Property("LengthSql"); + + b.Property("MediumType"); + + b.Property("Name"); + + b.Property("Organization"); + + b.Property("SscId"); + + b.Property("TestedSequentialMediaId"); + + b.Property("Width"); + + b.Property("WidthSql"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.HasIndex("TestedSequentialMediaId"); + + b.ToTable("SscSupportedMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SupportedDensity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("BitsPerMm"); + + b.Property("BitsPerMmSql"); + + b.Property("Capacity"); + + b.Property("CapacitySql"); + + b.Property("DefaultDensity"); + + b.Property("Description"); + + b.Property("Duplicate"); + + b.Property("Name"); + + b.Property("Organization"); + + b.Property("PrimaryCode"); + + b.Property("SecondaryCode"); + + b.Property("SscId"); + + b.Property("TestedSequentialMediaId"); + + b.Property("Tracks"); + + b.Property("TracksSql"); + + b.Property("Width"); + + b.Property("WidthSql"); + + b.Property("Writable"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.HasIndex("TestedSequentialMediaId"); + + b.ToTable("SupportedDensity"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AtaId"); + + b.Property("BlockSize"); + + b.Property("BlockSizeSql"); + + b.Property("Blocks"); + + b.Property("BlocksSql"); + + b.Property("CHSId"); + + b.Property("CanReadAACS"); + + b.Property("CanReadADIP"); + + b.Property("CanReadATIP"); + + b.Property("CanReadBCA"); + + b.Property("CanReadC2Pointers"); + + b.Property("CanReadCMI"); + + b.Property("CanReadCorrectedSubchannel"); + + b.Property("CanReadCorrectedSubchannelWithC2"); + + b.Property("CanReadDCB"); + + b.Property("CanReadDDS"); + + b.Property("CanReadDMI"); + + b.Property("CanReadDiscInformation"); + + b.Property("CanReadFirstTrackPreGap"); + + b.Property("CanReadFullTOC"); + + b.Property("CanReadHDCMI"); + + b.Property("CanReadLayerCapacity"); + + b.Property("CanReadLeadIn"); + + b.Property("CanReadLeadOut"); + + b.Property("CanReadMediaID"); + + b.Property("CanReadMediaSerial"); + + b.Property("CanReadPAC"); + + b.Property("CanReadPFI"); + + b.Property("CanReadPMA"); + + b.Property("CanReadPQSubchannel"); + + b.Property("CanReadPQSubchannelWithC2"); + + b.Property("CanReadPRI"); + + b.Property("CanReadRWSubchannel"); + + b.Property("CanReadRWSubchannelWithC2"); + + b.Property("CanReadRecordablePFI"); + + b.Property("CanReadSpareAreaInformation"); + + b.Property("CanReadTOC"); + + b.Property("CurrentCHSId"); + + b.Property("Density"); + + b.Property("IdentifyData"); + + b.Property("LBA48Sectors"); + + b.Property("LBA48SectorsSql"); + + b.Property("LBASectors"); + + b.Property("LBASectorsSql"); + + b.Property("LogicalAlignment"); + + b.Property("LogicalAlignmentSql"); + + b.Property("LongBlockSize"); + + b.Property("LongBlockSizeSql"); + + b.Property("Manufacturer"); + + b.Property("MediaIsRecognized"); + + b.Property("MediumType"); + + b.Property("MediumTypeName"); + + b.Property("MmcId"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("Model"); + + b.Property("NominalRotationRate"); + + b.Property("NominalRotationRateSql"); + + b.Property("PhysicalBlockSize"); + + b.Property("PhysicalBlockSizeSql"); + + b.Property("ScsiId"); + + b.Property("SolidStateDevice"); + + b.Property("SupportsHLDTSTReadRawDVD"); + + b.Property("SupportsNECReadCDDA"); + + b.Property("SupportsPioneerReadCDDA"); + + b.Property("SupportsPioneerReadCDDAMSF"); + + b.Property("SupportsPlextorReadCDDA"); + + b.Property("SupportsPlextorReadRawDVD"); + + b.Property("SupportsRead10"); + + b.Property("SupportsRead12"); + + b.Property("SupportsRead16"); + + b.Property("SupportsRead6"); + + b.Property("SupportsReadCapacity"); + + b.Property("SupportsReadCapacity16"); + + b.Property("SupportsReadCd"); + + b.Property("SupportsReadCdMsf"); + + b.Property("SupportsReadCdMsfRaw"); + + b.Property("SupportsReadCdRaw"); + + b.Property("SupportsReadDma"); + + b.Property("SupportsReadDmaLba"); + + b.Property("SupportsReadDmaLba48"); + + b.Property("SupportsReadDmaRetry"); + + b.Property("SupportsReadDmaRetryLba"); + + b.Property("SupportsReadLba"); + + b.Property("SupportsReadLba48"); + + b.Property("SupportsReadLong"); + + b.Property("SupportsReadLong16"); + + b.Property("SupportsReadLongLba"); + + b.Property("SupportsReadLongRetry"); + + b.Property("SupportsReadLongRetryLba"); + + b.Property("SupportsReadRetry"); + + b.Property("SupportsReadRetryLba"); + + b.Property("SupportsReadSectors"); + + b.Property("SupportsSeek"); + + b.Property("SupportsSeekLba"); + + b.Property("UnformattedBPS"); + + b.Property("UnformattedBPSSql"); + + b.Property("UnformattedBPT"); + + b.Property("UnformattedBPTSql"); + + b.HasKey("Id"); + + b.HasIndex("AtaId"); + + b.HasIndex("CHSId"); + + b.HasIndex("CurrentCHSId"); + + b.HasIndex("MmcId"); + + b.HasIndex("ScsiId"); + + b.ToTable("TestedMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("CanReadMediaSerial"); + + b.Property("Density"); + + b.Property("Manufacturer"); + + b.Property("MediaIsRecognized"); + + b.Property("MediumType"); + + b.Property("MediumTypeName"); + + b.Property("ModeSense10Data"); + + b.Property("ModeSense6Data"); + + b.Property("Model"); + + b.Property("SscId"); + + b.HasKey("Id"); + + b.HasIndex("SscId"); + + b.ToTable("TestedSequentialMedia"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Usb", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Descriptors"); + + b.Property("Manufacturer"); + + b.Property("Product"); + + b.Property("ProductID"); + + b.Property("ProductIDSql"); + + b.Property("RemovableMedia"); + + b.Property("VendorID"); + + b.Property("VendorIDSql"); + + b.HasKey("Id"); + + b.ToTable("Usb"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Command", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Commands"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Device", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ATAId"); + + b.Property("ATAPIId"); + + b.Property("CompactFlash"); + + b.Property("FireWireId"); + + b.Property("LastSynchronized"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("MultiMediaCardId"); + + b.Property("PCMCIAId"); + + b.Property("Revision"); + + b.Property("SCSIId"); + + b.Property("SecureDigitalId"); + + b.Property("Type"); + + b.Property("USBId"); + + b.HasKey("Id"); + + b.HasIndex("ATAId"); + + b.HasIndex("ATAPIId"); + + b.HasIndex("FireWireId"); + + b.HasIndex("MultiMediaCardId"); + + b.HasIndex("PCMCIAId"); + + b.HasIndex("SCSIId"); + + b.HasIndex("SecureDigitalId"); + + b.HasIndex("USBId"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.DeviceStat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Bus"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("Revision"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("SeenDevices"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Filesystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Filesystems"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Filter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Filters"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Media", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Real"); + + b.Property("Synchronized"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.ToTable("Medias"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.MediaFormat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("MediaFormats"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.OperatingSystem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.Property("Version"); + + b.HasKey("Id"); + + b.ToTable("OperatingSystems"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Partition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Name"); + + b.Property("Synchronized"); + + b.HasKey("Id"); + + b.ToTable("Partitions"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Report", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ATAId"); + + b.Property("ATAPIId"); + + b.Property("CompactFlash"); + + b.Property("Created"); + + b.Property("FireWireId"); + + b.Property("Manufacturer"); + + b.Property("Model"); + + b.Property("MultiMediaCardId"); + + b.Property("PCMCIAId"); + + b.Property("Revision"); + + b.Property("SCSIId"); + + b.Property("SecureDigitalId"); + + b.Property("Type"); + + b.Property("USBId"); + + b.Property("Uploaded"); + + b.HasKey("Id"); + + b.HasIndex("ATAId"); + + b.HasIndex("ATAPIId"); + + b.HasIndex("FireWireId"); + + b.HasIndex("MultiMediaCardId"); + + b.HasIndex("PCMCIAId"); + + b.HasIndex("SCSIId"); + + b.HasIndex("SecureDigitalId"); + + b.HasIndex("USBId"); + + b.ToTable("Reports"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbProduct", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("ModifiedWhen"); + + b.Property("Product"); + + b.Property("ProductId"); + + b.Property("VendorId"); + + b.HasKey("Id"); + + b.HasIndex("VendorId"); + + b.HasIndex("ProductId"); + + b.HasIndex("ModifiedWhen"); + + b.ToTable("UsbProducts"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbVendor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AddedWhen"); + + b.Property("ModifiedWhen"); + + b.Property("Vendor"); + + b.HasKey("Id"); + + b.HasIndex("ModifiedWhen"); + + b.ToTable("UsbVendors"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Version", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Count"); + + b.Property("Synchronized"); + + b.Property("Value"); + + b.HasKey("Id"); + + b.ToTable("Versions"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Ata", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedMedia", "ReadCapabilities") + .WithMany() + .HasForeignKey("ReadCapabilitiesId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.BlockDescriptor", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode") + .WithMany("BlockDescriptors") + .HasForeignKey("ScsiModeId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.DensityCode", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia") + .WithMany("DensityCodes") + .HasForeignKey("SscSupportedMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Mmc", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcFeatures", "Features") + .WithMany() + .HasForeignKey("FeaturesId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.Scsi", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode", "ModeSense") + .WithMany() + .HasForeignKey("ModeSenseId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Mmc", "MultiMediaDevice") + .WithMany() + .HasForeignKey("MultiMediaDeviceId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedMedia", "ReadCapabilities") + .WithMany() + .HasForeignKey("ReadCapabilitiesId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc", "SequentialDevice") + .WithMany() + .HasForeignKey("SequentialDeviceId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.ScsiPage", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi") + .WithMany("EVPDPages") + .HasForeignKey("ScsiId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.ScsiMode") + .WithMany("ModePages") + .HasForeignKey("ScsiModeId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SscSupportedMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("SupportedMediaTypes") + .HasForeignKey("SscId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia") + .WithMany("SupportedMediaTypes") + .HasForeignKey("TestedSequentialMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.SupportedDensity", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("SupportedDensities") + .HasForeignKey("SscId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia") + .WithMany("SupportedDensities") + .HasForeignKey("TestedSequentialMediaId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata") + .WithMany("RemovableMedias") + .HasForeignKey("AtaId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Chs", "CHS") + .WithMany() + .HasForeignKey("CHSId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Chs", "CurrentCHS") + .WithMany() + .HasForeignKey("CurrentCHSId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Mmc") + .WithMany("TestedMedia") + .HasForeignKey("MmcId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi") + .WithMany("RemovableMedias") + .HasForeignKey("ScsiId"); + }); + + modelBuilder.Entity("DiscImageChef.CommonTypes.Metadata.TestedSequentialMedia", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ssc") + .WithMany("TestedMedia") + .HasForeignKey("SscId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Device", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATA") + .WithMany() + .HasForeignKey("ATAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATAPI") + .WithMany() + .HasForeignKey("ATAPIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.FireWire", "FireWire") + .WithMany() + .HasForeignKey("FireWireId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "MultiMediaCard") + .WithMany() + .HasForeignKey("MultiMediaCardId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Pcmcia", "PCMCIA") + .WithMany() + .HasForeignKey("PCMCIAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi", "SCSI") + .WithMany() + .HasForeignKey("SCSIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "SecureDigital") + .WithMany() + .HasForeignKey("SecureDigitalId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Usb", "USB") + .WithMany() + .HasForeignKey("USBId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.Report", b => + { + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATA") + .WithMany() + .HasForeignKey("ATAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Ata", "ATAPI") + .WithMany() + .HasForeignKey("ATAPIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.FireWire", "FireWire") + .WithMany() + .HasForeignKey("FireWireId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "MultiMediaCard") + .WithMany() + .HasForeignKey("MultiMediaCardId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Pcmcia", "PCMCIA") + .WithMany() + .HasForeignKey("PCMCIAId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Scsi", "SCSI") + .WithMany() + .HasForeignKey("SCSIId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.MmcSd", "SecureDigital") + .WithMany() + .HasForeignKey("SecureDigitalId"); + + b.HasOne("DiscImageChef.CommonTypes.Metadata.Usb", "USB") + .WithMany() + .HasForeignKey("USBId"); + }); + + modelBuilder.Entity("DiscImageChef.Database.Models.UsbProduct", b => + { + b.HasOne("DiscImageChef.Database.Models.UsbVendor", "Vendor") + .WithMany("Products") + .HasForeignKey("VendorId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/DiscImageChef.Database/Migrations/20181224172147_FixUsbIdsAndIndexes.cs b/DiscImageChef.Database/Migrations/20181224172147_FixUsbIdsAndIndexes.cs new file mode 100644 index 000000000..2e89cd002 --- /dev/null +++ b/DiscImageChef.Database/Migrations/20181224172147_FixUsbIdsAndIndexes.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DiscImageChef.Database.Migrations +{ + public partial class FixUsbIdsAndIndexes : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex("IX_UsbProducts_ProductId", "UsbProducts", "ProductId"); + migrationBuilder.CreateIndex("IX_UsbProducts_ModifiedWhen", "UsbProducts", "ModifiedWhen"); + migrationBuilder.CreateIndex("IX_UsbVendors_ModifiedWhen", "UsbVendors", "ModifiedWhen"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex("IX_UsbProducts_ProductId", "UsbProducts"); + migrationBuilder.DropIndex("IX_UsbProducts_ModifiedWhen", "UsbProducts"); + migrationBuilder.DropIndex("IX_UsbVendors_ModifiedWhen", "UsbVendors"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs b/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs index 439c6256d..14c4cc4e1 100644 --- a/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs +++ b/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs @@ -1140,6 +1140,10 @@ namespace DiscImageChef.Database.Migrations b.HasIndex("VendorId"); + b.HasIndex("ProductId"); + + b.HasIndex("ModifiedWhen"); + b.ToTable("UsbProducts"); }); @@ -1155,6 +1159,8 @@ namespace DiscImageChef.Database.Migrations b.HasKey("Id"); + b.HasIndex("ModifiedWhen"); + b.ToTable("UsbVendors"); }); diff --git a/DiscImageChef.Database/Models/UsbProduct.cs b/DiscImageChef.Database/Models/UsbProduct.cs index c6cfb5d8e..ef433311f 100644 --- a/DiscImageChef.Database/Models/UsbProduct.cs +++ b/DiscImageChef.Database/Models/UsbProduct.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace DiscImageChef.Database.Models { @@ -15,14 +16,15 @@ namespace DiscImageChef.Database.Models } [Key] - public int Id { get; set; } - public ushort ProductId { get; set; } - - public string Product { get; set; } - public DateTime AddedWhen { get; set; } + public int Id { get; set; } + [Index] + public ushort ProductId { get; set; } + public string Product { get; set; } + public DateTime AddedWhen { get; set; } + [Index] public DateTime ModifiedWhen { get; set; } - - public ushort VendorId { get; set; } - public virtual UsbVendor Vendor { get; set; } + [Index] + public ushort VendorId { get; set; } + public virtual UsbVendor Vendor { get; set; } } } \ No newline at end of file diff --git a/DiscImageChef.Database/Models/UsbVendor.cs b/DiscImageChef.Database/Models/UsbVendor.cs index 9a49ec073..d4210c319 100644 --- a/DiscImageChef.Database/Models/UsbVendor.cs +++ b/DiscImageChef.Database/Models/UsbVendor.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace DiscImageChef.Database.Models { @@ -16,9 +17,10 @@ namespace DiscImageChef.Database.Models } [Key] - public ushort Id { get; set; } - public string Vendor { get; set; } - public DateTime AddedWhen { get; set; } + public ushort Id { get; set; } + public string Vendor { get; set; } + public DateTime AddedWhen { get; set; } + [Index] public DateTime ModifiedWhen { get; set; } public virtual ICollection Products { get; set; } diff --git a/DiscImageChef.Server/DiscImageChef.Server.csproj b/DiscImageChef.Server/DiscImageChef.Server.csproj index 018814e3d..285bbd054 100644 --- a/DiscImageChef.Server/DiscImageChef.Server.csproj +++ b/DiscImageChef.Server/DiscImageChef.Server.csproj @@ -221,6 +221,10 @@ 201812240552109_StoreUsbIdsInDatabase.cs + + + 201812241719441_FixUsbIdsAndIndexes.cs + @@ -325,6 +329,9 @@ 201812240552109_StoreUsbIdsInDatabase.cs + + 201812241719441_FixUsbIdsAndIndexes.cs + 10.0 diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs new file mode 100644 index 000000000..57d3375cb --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.Designer.cs @@ -0,0 +1,29 @@ +// +namespace DiscImageChef.Server.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class FixUsbIdsAndIndexes : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(FixUsbIdsAndIndexes)); + + string IMigrationMetadata.Id + { + get { return "201812241719441_FixUsbIdsAndIndexes"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs new file mode 100644 index 000000000..b90c19084 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.cs @@ -0,0 +1,25 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class FixUsbIdsAndIndexes : DbMigration + { + public override void Up() + { + AddColumn("dbo.UsbVendors", "VendorId", c => c.Int(false)); + CreateIndex("dbo.UsbProducts", "ProductId"); + CreateIndex("dbo.UsbProducts", "ModifiedWhen"); + CreateIndex("dbo.UsbVendors", "VendorId", true); + CreateIndex("dbo.UsbVendors", "ModifiedWhen"); + } + + public override void Down() + { + DropIndex("dbo.UsbVendors", new[] {"ModifiedWhen"}); + DropIndex("dbo.UsbVendors", new[] {"VendorId"}); + DropIndex("dbo.UsbProducts", new[] {"ModifiedWhen"}); + DropIndex("dbo.UsbProducts", new[] {"ProductId"}); + DropColumn("dbo.UsbVendors", "VendorId"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx new file mode 100644 index 000000000..18616cd2e --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812241719441_FixUsbIdsAndIndexes.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UsbProduct.cs b/DiscImageChef.Server/Models/UsbProduct.cs index c5b9367a8..380955ff9 100644 --- a/DiscImageChef.Server/Models/UsbProduct.cs +++ b/DiscImageChef.Server/Models/UsbProduct.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace DiscImageChef.Server.Models { @@ -7,22 +8,24 @@ namespace DiscImageChef.Server.Models { public UsbProduct() { } - public UsbProduct(ushort vendorId, ushort id, string product) + public UsbProduct(UsbVendor vendor, ushort id, string product) { ProductId = id; Product = product; AddedWhen = ModifiedWhen = DateTime.UtcNow; + Vendor = vendor; } [Key] - public int Id { get; set; } - public int ProductId { get; set; } - - public string Product { get; set; } - public DateTime AddedWhen { get; set; } + public int Id { get; set; } + [Index] + public int ProductId { get; set; } + public string Product { get; set; } + public DateTime AddedWhen { get; set; } + [Index] public DateTime ModifiedWhen { get; set; } - - public int VendorId { get; set; } - public virtual UsbVendor Vendor { get; set; } + [Index] + public int VendorId { get; set; } + public virtual UsbVendor Vendor { get; set; } } } \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UsbVendor.cs b/DiscImageChef.Server/Models/UsbVendor.cs index e322255ac..919fe3754 100644 --- a/DiscImageChef.Server/Models/UsbVendor.cs +++ b/DiscImageChef.Server/Models/UsbVendor.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace DiscImageChef.Server.Models { @@ -10,15 +11,18 @@ namespace DiscImageChef.Server.Models public UsbVendor(ushort id, string vendor) { - Id = id; + VendorId = id; Vendor = vendor; AddedWhen = ModifiedWhen = DateTime.UtcNow; } [Key] - public int Id { get; set; } - public string Vendor { get; set; } - public DateTime AddedWhen { get; set; } + public int Id { get; set; } + [Index(IsUnique = true)] + public int VendorId { get; set; } + public string Vendor { get; set; } + public DateTime AddedWhen { get; set; } + [Index] public DateTime ModifiedWhen { get; set; } public virtual ICollection Products { get; set; }