0

私はPHP/MySQLのバックグラウンドを持っているので、.NETで発生している問題はそれが原因である可能性があります。コンピューターのハードウェアとソフトウェアのインベントリトラッカーを作成する方法を1週間投稿した後、誰かがついに私が間違ったことをしていると思ったと言った。問題は私のコードではなく、私のデザインでした。それは確かに可能です。私はEFCodeFirstでこれを行おうとしていますが、コードを使用してデータベースを生成するという考えは私には異質です。しかし、私はデータベースを機能させ、すべてが正しいことを示していました。しかし、データベースから必要なものを引き出すことはできません。

私がやりたいのは、ハードウェアの種類のカテゴリを持つダッシュボードページを作成することです。したがって、PCのリスト、モニターのリスト、プリンターのリストなどがあります。当初、私が行ったことは、MySQLの知識に基づいていました。Hardwareテーブル(クラス)とHardwareTypesテーブル(クラス)を作成しました。MySQLでは、HardwareTypeのIDをHardwareテーブルに配置することで、結合を実行できます。そうすれば、単純な内部結合ですべてのPCを取得できます。

.NETは違うようです。中間テーブル(HardwareHardwareTypes)を作成してから、他の2つのテーブルを接続します。それは奇妙に思えますが、大丈夫です。しかし、すべてのPCを入手しようとすると、クエリを作成するために必要なヘルプが得られないようです。ですから、私の質問とクラスを見て、あなたの考えを教えてください。

HardwareTypesではなくHardwareを返すクエリ-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; }
    }

繰り返しになりますが、私が必要としているのがより高度な設計変更である場合は、私に知らせてください。別のクエリが必要な場合は、そのことを知らせてください。3番目の(中間)テーブルは動的に生成され、それを投稿する方法を知るのは困難です。私はこれですべての助けをいただければ幸いです。最後に必要なのはPCのリストです。シードデータのサンプルは次のとおりです。

    ... 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 に答える