2013-10-27 39 views
1

我有這種情況(MVC + EF)BLL邏輯 - 數據訪問模式

我有兩個表分類和產品在數據庫中。

Initlialy,我爲類別創建一個BLL。 BBL有CRUD方法。

在D(刪除)中。此方法將按ID刪除類別。

所以。有關類別BBL的一切都已完成。

接下來,我爲產品創建一個BLL。它也有CRUD方法。

在C(創建)視圖中。我展示了一個HTML,這是一個產品類別列表。

我想這個問題問在這裏:

當我添加產品BLL到我的項目。我必須修改類別BLL的Delete方法。

我有/想要將名爲DeleteProductByCategoryID()的新方法添加到BBL。我在BLL類的Delete方法中調用它。

public void Delete(int id) 
{ 
xxxxx.DeleteProductByCategoryID(id); 
categoryBLL.DeleteCategory(id); 
} 

該方法將刪除指定類別ID的所有Product。

所以問題是:我應該在哪裏創建DeleteProductByCategoryID()方法(類別或產品BLL)?

爲了在Controller.Product.Create()視圖中顯示Category的列表,我還想創建一個新的方法來獲取Category的集合。我應該將此方法放在Product BLL還是Category BLL中?

回答

0

通常情況下,一個產品至少有一個類別,否則不是。通過categoryId刪除產品是否有意義(例如,產品綁定到多個類別時)?

但無論如何,一般你不想創建硬依賴。

一種可能性是在產品數據庫,保存創建複合鍵表所有可能的CategoryId的一個產品編號。通過這種方式,您可以在Product和Category之間建立連接,但不會創建任何硬數據庫依賴關係,因爲該表只保存值。這也簡化了CRUD操作。通常這樣的組合表格被命名爲這樣:Entity1_has_Entity2

[Product_has_Category] 
[ProductId] PK, NOT NULL 
[CategoryId] PK, NOT NULL 

在類別10,13和5填充了產品編號1:

[1, 10] 
[1, 13] 
[1, 5] 

在這種情況下刪除方法應該被放置在ProductBLL和可能看起來像這樣:

public void Delete(int id) 
{ 
    // delete the _has_ relations - there is no connection between product and category anymore 
    productBLL.DeleteCategoriesForProduct(id); 
    productBLL.DeleteProduct(id); 
} 

顯示在ProductBLL中的方法也很簡單:

public void ShowCategoriesForProduct(int id) 
{ 
    // from the _has_ relations table 
    List<int> categoryIds = productBLL.CategoriesForProduct(id); 
    foreach (int categoryId in categoryIds) 
    { 
     var categoryName = categoryBLL.CategoryInfo(categoryId).Name; 
    } 
} 

我會分類問題,而不是設計模式的數據庫規範化。有關DB標準化的一個很好的例子可以在this article找到。

+0

productBLL.CategoriesForProduct(ID);以上方法是冗餘代碼。 BLL類別首先創建。因此,GetCategories()存在於BLL類中。在Product BLL中,我們應該創建新的方法還是創建新的Category實例並調用GetCategories()? – 2013-10-28 10:40:23

+0

@Giang我的建議引入了一個新表,以便在產品和類別之間實現簡單的** n到n **關係。我不認爲,代碼是多餘的。 「BLL創建的第一個類別」究竟是什麼意思?在方法中,** ShowCategoriesForProduct **僅提取產品分配到的類別,而不提供**全部**可能的類別。如果您只是調用categoryBLL.GetCategories(),那麼您如何知道要爲當前選定的產品顯示哪個類別? – pasty