ASP.NET MVC:需要帮助组织数据结构类

时间:2012-12-12 21:01:45

标签: asp.net-mvc-4 ef-code-first

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

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

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

查询,返回硬件,而不是硬件类型 - 如何获取HardwareTypes?):

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; }
    }

HardwareTypes类:

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" }
            };

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

1 个答案:

答案 0 :(得分:0)

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

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