From 383794baceb5ed686b8de0ee122abaa22c207e97 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 24 Dec 2018 06:29:52 +0000 Subject: [PATCH] Add database entities for USB vendor and product IDs. --- DiscImageChef.Database/Context.cs | 2 + .../DiscImageChef.Database.csproj | 4 + ...24044809_StoreUsbIdsInDatabase.Designer.cs | 1401 +++++++++++++++++ .../20181224044809_StoreUsbIdsInDatabase.cs | 46 + .../Migrations/DicContextModelSnapshot.cs | 43 + DiscImageChef.Database/Models/UsbProduct.cs | 28 + DiscImageChef.Database/Models/UsbVendor.cs | 26 + .../DiscImageChef.Server.csproj | 9 + ...40552109_StoreUsbIdsInDatabase.Designer.cs | 29 + .../201812240552109_StoreUsbIdsInDatabase.cs | 39 + ...201812240552109_StoreUsbIdsInDatabase.resx | 126 ++ DiscImageChef.Server/Models/Context.cs | 2 + DiscImageChef.Server/Models/UsbProduct.cs | 28 + DiscImageChef.Server/Models/UsbVendor.cs | 26 + 14 files changed, 1809 insertions(+) create mode 100644 DiscImageChef.Database/Migrations/20181224044809_StoreUsbIdsInDatabase.Designer.cs create mode 100644 DiscImageChef.Database/Migrations/20181224044809_StoreUsbIdsInDatabase.cs create mode 100644 DiscImageChef.Database/Models/UsbProduct.cs create mode 100644 DiscImageChef.Database/Models/UsbVendor.cs create mode 100644 DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs create mode 100644 DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs create mode 100644 DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx create mode 100644 DiscImageChef.Server/Models/UsbProduct.cs create mode 100644 DiscImageChef.Server/Models/UsbVendor.cs diff --git a/DiscImageChef.Database/Context.cs b/DiscImageChef.Database/Context.cs index 0ea8a1124..2b5407768 100644 --- a/DiscImageChef.Database/Context.cs +++ b/DiscImageChef.Database/Context.cs @@ -54,6 +54,8 @@ namespace DiscImageChef.Database public DbSet SeenDevices { get; set; } public DbSet OperatingSystems { get; set; } public DbSet Versions { get; set; } + public DbSet UsbVendors { get; set; } + public DbSet UsbProducts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { diff --git a/DiscImageChef.Database/DiscImageChef.Database.csproj b/DiscImageChef.Database/DiscImageChef.Database.csproj index f788fc8aa..042170388 100644 --- a/DiscImageChef.Database/DiscImageChef.Database.csproj +++ b/DiscImageChef.Database/DiscImageChef.Database.csproj @@ -80,6 +80,8 @@ + + @@ -91,6 +93,8 @@ + + diff --git a/DiscImageChef.Database/Migrations/20181224044809_StoreUsbIdsInDatabase.Designer.cs b/DiscImageChef.Database/Migrations/20181224044809_StoreUsbIdsInDatabase.Designer.cs new file mode 100644 index 000000000..0610a572d --- /dev/null +++ b/DiscImageChef.Database/Migrations/20181224044809_StoreUsbIdsInDatabase.Designer.cs @@ -0,0 +1,1401 @@ +// +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("20181224044809_StoreUsbIdsInDatabase")] + partial class StoreUsbIdsInDatabase + { + 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.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.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/20181224044809_StoreUsbIdsInDatabase.cs b/DiscImageChef.Database/Migrations/20181224044809_StoreUsbIdsInDatabase.cs new file mode 100644 index 000000000..1e2a4fb7c --- /dev/null +++ b/DiscImageChef.Database/Migrations/20181224044809_StoreUsbIdsInDatabase.cs @@ -0,0 +1,46 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DiscImageChef.Database.Migrations +{ + public partial class StoreUsbIdsInDatabase : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable("UsbVendors", + table => new + { + Id = table.Column(nullable: false), + Vendor = table.Column(nullable: true), + AddedWhen = table.Column(nullable: false), + ModifiedWhen = table.Column(nullable: false) + }, constraints: table => { table.PrimaryKey("PK_UsbVendors", x => x.Id); }); + + migrationBuilder.CreateTable("UsbProducts", + table => new + { + Id = table.Column(nullable: false) + .Annotation("Sqlite:Autoincrement", true), + ProductId = table.Column(nullable: false), + Product = table.Column(nullable: true), + AddedWhen = table.Column(nullable: false), + ModifiedWhen = table.Column(nullable: false), + VendorId = table.Column(nullable: false) + }, constraints: table => + { + table.PrimaryKey("PK_UsbProducts", x => x.Id); + table.ForeignKey("FK_UsbProducts_UsbVendors_VendorId", x => x.VendorId, + "UsbVendors", "Id", onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex("IX_UsbProducts_VendorId", "UsbProducts", "VendorId"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable("UsbProducts"); + + migrationBuilder.DropTable("UsbVendors"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs b/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs index bf2620a55..439c6256d 100644 --- a/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs +++ b/DiscImageChef.Database/Migrations/DicContextModelSnapshot.cs @@ -1122,6 +1122,42 @@ namespace DiscImageChef.Database.Migrations 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.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.ToTable("UsbVendors"); + }); + modelBuilder.Entity("DiscImageChef.Database.Models.Version", b => { b.Property("Id").ValueGeneratedOnAdd(); @@ -1270,6 +1306,13 @@ namespace DiscImageChef.Database.Migrations 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/Models/UsbProduct.cs b/DiscImageChef.Database/Models/UsbProduct.cs new file mode 100644 index 000000000..c6cfb5d8e --- /dev/null +++ b/DiscImageChef.Database/Models/UsbProduct.cs @@ -0,0 +1,28 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Database.Models +{ + public class UsbProduct + { + public UsbProduct() { } + + public UsbProduct(ushort vendorId, ushort id, string product) + { + ProductId = id; + Product = product; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + [Key] + public int Id { get; set; } + public ushort ProductId { get; set; } + + public string Product { get; set; } + public DateTime AddedWhen { get; set; } + public DateTime ModifiedWhen { get; set; } + + 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 new file mode 100644 index 000000000..9a49ec073 --- /dev/null +++ b/DiscImageChef.Database/Models/UsbVendor.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Database.Models +{ + public class UsbVendor + { + public UsbVendor() { } + + public UsbVendor(ushort id, string vendor) + { + Id = id; + Vendor = vendor; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + [Key] + public ushort Id { get; set; } + public string Vendor { get; set; } + public DateTime AddedWhen { get; set; } + public DateTime ModifiedWhen { get; set; } + + public virtual ICollection Products { get; set; } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/DiscImageChef.Server.csproj b/DiscImageChef.Server/DiscImageChef.Server.csproj index 74495e524..018814e3d 100644 --- a/DiscImageChef.Server/DiscImageChef.Server.csproj +++ b/DiscImageChef.Server/DiscImageChef.Server.csproj @@ -217,6 +217,10 @@ 201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs + + + 201812240552109_StoreUsbIdsInDatabase.cs + @@ -229,6 +233,8 @@ + + Statistics.aspx @@ -316,6 +322,9 @@ 201812232250198_UseBinaryDataForIdentifyInquiryAndModesInReports.cs + + 201812240552109_StoreUsbIdsInDatabase.cs + 10.0 diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.Designer.cs new file mode 100644 index 000000000..d65fe029e --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.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 StoreUsbIdsInDatabase : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(StoreUsbIdsInDatabase)); + + string IMigrationMetadata.Id + { + get { return "201812240552109_StoreUsbIdsInDatabase"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs new file mode 100644 index 000000000..793034813 --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.cs @@ -0,0 +1,39 @@ +using System.Data.Entity.Migrations; + +namespace DiscImageChef.Server.Migrations +{ + public partial class StoreUsbIdsInDatabase : DbMigration + { + public override void Up() + { + CreateTable("dbo.UsbProducts", + c => new + { + Id = c.Int(false, true), + ProductId = c.Int(false), + Product = c.String(unicode: false), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0), + VendorId = c.Int(false) + }).PrimaryKey(t => t.Id).ForeignKey("dbo.UsbVendors", t => t.VendorId, true) + .Index(t => t.VendorId); + + CreateTable("dbo.UsbVendors", + c => new + { + Id = c.Int(false, true), + Vendor = c.String(unicode: false), + AddedWhen = c.DateTime(false, 0), + ModifiedWhen = c.DateTime(false, 0) + }).PrimaryKey(t => t.Id); + } + + public override void Down() + { + DropForeignKey("dbo.UsbProducts", "VendorId", "dbo.UsbVendors"); + DropIndex("dbo.UsbProducts", new[] {"VendorId"}); + DropTable("dbo.UsbVendors"); + DropTable("dbo.UsbProducts"); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.resx new file mode 100644 index 000000000..8bf29e47f --- /dev/null +++ b/DiscImageChef.Server/Migrations/201812240552109_StoreUsbIdsInDatabase.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/Context.cs b/DiscImageChef.Server/Models/Context.cs index fb369303e..ec6313247 100644 --- a/DiscImageChef.Server/Models/Context.cs +++ b/DiscImageChef.Server/Models/Context.cs @@ -49,5 +49,7 @@ namespace DiscImageChef.Server.Models public DbSet OperatingSystems { get; set; } public DbSet Partitions { get; set; } public DbSet Versions { get; set; } + public DbSet UsbVendors { get; set; } + public DbSet UsbProducts { get; set; } } } \ No newline at end of file diff --git a/DiscImageChef.Server/Models/UsbProduct.cs b/DiscImageChef.Server/Models/UsbProduct.cs new file mode 100644 index 000000000..c5b9367a8 --- /dev/null +++ b/DiscImageChef.Server/Models/UsbProduct.cs @@ -0,0 +1,28 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class UsbProduct + { + public UsbProduct() { } + + public UsbProduct(ushort vendorId, ushort id, string product) + { + ProductId = id; + Product = product; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + [Key] + public int Id { get; set; } + public int ProductId { get; set; } + + public string Product { get; set; } + public DateTime AddedWhen { get; set; } + public DateTime ModifiedWhen { get; set; } + + 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 new file mode 100644 index 000000000..e322255ac --- /dev/null +++ b/DiscImageChef.Server/Models/UsbVendor.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace DiscImageChef.Server.Models +{ + public class UsbVendor + { + public UsbVendor() { } + + public UsbVendor(ushort id, string vendor) + { + Id = id; + Vendor = vendor; + AddedWhen = ModifiedWhen = DateTime.UtcNow; + } + + [Key] + public int Id { get; set; } + public string Vendor { get; set; } + public DateTime AddedWhen { get; set; } + public DateTime ModifiedWhen { get; set; } + + public virtual ICollection Products { get; set; } + } +} \ No newline at end of file