私は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" }
};
シードデータの構造が間違っている場合は、そのことをお知らせください。ありがとう。