0

我来自 PHP/MySQL 背景,所以我在使用 .NET 时遇到的问题可能源于此。在发布了如何为我们的计算机硬件和软件创建库存跟踪器的一周之后,终于有人告诉我他认为我做错了。问题不是我的代码,而是我的设计。这当然是可能的。我正在尝试在 EF Code First 中执行此操作,而使用代码生成数据库的想法对我来说是陌生的。但是,我让数据库正常工作,一切都指向正确的事情。但我无法从数据库中提取我需要的内容。

我想做的是创建一个仪表板页面,其中包含硬件类型的类别。所以会有一个 PC 列表、一个监视器列表、一个打印机列表等。最初,我所做的是基于我对 MySQL 的了解。我创建了一个 Hardware 表(类)和一个 HardwareTypes 表(类)。在 MySQL 中,我所做的就是将 HardwareType 的 ID 放在 Hardware 表中,这样我就可以进行连接了。然后我可以通过一个简单的内部连接来获得我所有的 PC。

.NET 似乎有所不同。它想创建一个中间表——HardwareHardwareTypes,然后连接另外两个表。这看起来很奇怪,但没关系。但是当我去拿我所有的电脑时,我似乎无法获得编写查询所需的帮助。所以请看看我的查询和我的课程,让我知道你的想法。

查询,它返回硬件,而不是硬件类型——我如何获得硬件类型?):

var pcs = db.Hardware.Where(h => h.HardwareType.Any(hwt => hwt.HType == "PC"));
ViewBag.Pcs = pcs.ToList();

硬件类:

public class Hardware
    {
        public int Id { get; set; }
        public virtual ICollection<DeviceType> Type { get; set; }
        public string AssetTagId { get; set; }
        public virtual ICollection<Manufacturer> Manufacturer { get; set; }
        [Required]
        [StringLength(50)]
        public string ServiceTagId { get; set; }
        [Required]
        [StringLength(50)]
        public string SerialNumber { get; set; }
        [Required]
        [StringLength(75)]
        public string ProductNumber { get; set; }
       // [Required]
        [StringLength(20)]
        public string PurchaseDate { get; set; }
        [StringLength(20)]
        public string WarrantyExpiration { get; set; }
        [Required]
        [StringLength(20)]
        public string WarrantyType { get; set; }
        public virtual ICollection<Location> Location { get; set; }
        public virtual ICollection<HardwareType> HardwareType { get; set; }
        [Required]
        [StringLength(2000)]
        public string Notes { get; set; }
        public string POATag { get; set; }
    }

硬件类型类:

public class HardwareType
    {
        public int Id { get; set; }
        [Required]
        [StringLength(128)]
        public string HType { get; set; }
        public virtual ICollection<Hardware> Hardware { get; set; }
    }

同样,如果我需要更多高级设计更改,请告诉我。如果我需要不同的查询,请告诉我。第三个(中间)表是动态生成的,很难知道如何发布。我会很感激这方面的任何帮助。我最终需要的是个人电脑列表。以下是一些示例种子数据:

    ... new Hardware { AssetTagId = "2134", 
Type = device.Where(h => h.DType == "Network Device").ToArray(), 
Manufacturer = manuf.Where(h => h.ManufacturerName == "SonicWall").ToArray(), 
ServiceTagId = "5243", 
SerialNumber = "3456", 
ProductNumber = "2345", 
PurchaseDate = "2012-10-23", 
WarrantyExpiration = "2012-11-12", 
WarrantyType = "NBD", 
Location = loc.Where(h => h.LocationName == "Paradise Lane").ToArray(), 
Notes = "Scrapped",  
HardwareType = htype.Where(h => h.HType == "PC").ToArray()}, ...

 var htype = new List<HardwareType> {
                new HardwareType { HType = "PC" },
                new HardwareType { HType = "Monitor" },
                new HardwareType { HType = "Printer" },
                new HardwareType { HType = "Miscellaneous" }
            };

如果我的种子数据结构错误,请告诉我。谢谢。

4

1 回答 1

0

首先让我告诉你,在 PHP/MySQL 中工作的相同数据库设计也可以在这里工作。

我将向您建议的最简单的方法是在数据库中创建一个视图,该视图连接表 Hardware 和 HardwareType,将 nwly 创建的视图添加到您的数据库模型中,并从视图而不是表中获取所需的数据。

于 2012-12-13T06:32:37.883 回答