我有一个MySQL数据库,其中包含Items
和Stores
的表格,以及一个查找表ItemStores
,如下所示:
CREATE TABLE IF NOT EXISTS Items (
itemId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
description VARCHAR(256) NOT NULL DEFAULT '',
priceBeforeTax DECIMAL(10,2) NOT NULL,
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS Stores (
storeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
storeName VARCHAR(128) NOT NULL,
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS ItemStores (
storeId INT NOT NULL REFERENCES Stores(storeId),
itemId INT NOT NULL REFERENCES Items(itemId),
quantity INT NOT NULL
) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
应用程序将项目和商店存储在ObservableCollections
和Item
对象的Store
中,并且某些WPF控件绑定到这些ObservableCollections
,如下所示:< / p>
public class Store
{
public int storeId { get; set; }
public string storeName { get; set; }
public override string ToString()
{
return this.branchName;
}
}
private static ObservableCollection<Store> _stores = new ObservableCollection<Store>();
public static ObservableCollection<Store> Stores
{
get { return _stores; }
}
public class Item
{
public int itemId { get; set; }
public string description { get; set; }
public decimal priceBeforeTax { get; set; }
public override string ToString()
{
return this.description;
}
}
private static ObservableCollection<Item> _items = new ObservableCollection<Item>();
public static ObservableCollection<Item> Items
{
get { return _items; }
}
现在我的困境在于如何分配ItemStores
数据。我正在考虑在每个Item
中使用HashTable将storeID
映射到每个Store
中的项目数量。是否有更好的方法来映射它,假设我偶尔会通过其Item
搜索itemId
?我已经运行了SELECT * FROM Items
来填充ObservableCollection,我担心运行另一个查询以从每个商店获取数量将真正打击MySQL。 JOIN
将无济于事,因为我不知道将返回多少商店并为同一商品返回多行(每个存储一行的商店)将使数据放入的ObservableCollection。
答案 0 :(得分:1)
我不会走那条路。您很快就会发现自己正在构建ORM而不是使用ORM。此外,将整个数据库读入内存集合是个坏主意,因为一旦您意识到数据已过时并开始重新加载所有内容,它就会成为性能问题。
对于原始问题,ORM类将相关子集合作为属性,因此您不必搜索所有这些 - 您将找到一个Store并读取所有ItemStore对象。如果您需要所有商店中的商品列表,您将向数据库询问该信息。