2013-10-27 3 views
1

이 상황이 있습니다 (MVC + EF)BLL 논리 - 데이터 액세스 패턴

데이터베이스에 두 개의 테이블 범주와 제품이 있습니다.

Initlialy, 카테고리에 대한 BLL을 만듭니다. BBL에는 CRUD 메소드가 있습니다.

D (삭제)에서. 이 메소드는 ID로 카테고리를 삭제합니다.

So. 카테고리 BBL에 관한 모든 작업이 완료되었습니다.

다음으로 제품 용 BLL을 만듭니다. 또한 CRUD 메소드도 있습니다.

C (만들기)보기. HTML을 보여줍니다. 이것은 제품 카테고리 목록입니다.

내가 원하는 문제는 여기에 요청 :

것은 내 프로젝트에 제품 BLL을 추가 할 때. 범주 BLL의 Delete 메서드를 수정해야합니다.

BBL에 DeleteProductByCategoryID()라는 새 메서드를 추가하고 싶습니다. 그리고 카테고리 BLL의 Delete 메소드에서 호출합니다.

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

이 메서드는 지정된 카테고리 ID의 모든 제품을 삭제합니다.

문제는 다음과 같습니다. DeleteProductByCategoryID() 메소드 (카테고리 또는 제품 BLL)는 어디에 만들어야합니까?

Controller.Product.Create()보기에서 범주 목록을 표시하려면 범주 컬렉션을 가져 오는 새 메서드를 만들고 싶습니다.이 메서드를 Product BLL 또는 BLL 범주에 넣어야합니까?

답변

0

일반적으로 제품에는 범주가 하나 이상 포함되어 있지 않습니다. categoryId를 통한 제품 삭제가 의미가 있습니까 (예 : 제품이 둘 이상의 카테고리에 바인딩 된 경우)?

하지만 어쨌든 일반적으로 하드 종속성을 만들고 싶지는 않습니다.

하나의 가능성은 보유하고있는 제품 DB,에 복합 키 테이블을 만들 것 하나 제품 ID 가능한 모든 카테고리 ID의. 이 방법을 사용하면 Product와 Category를 연결할 수 있지만 테이블에 값만 있기 때문에 하드 DB 종속성을 만들지 않습니다. 이것은 또한 CRUD 작업을 단순화합니다. 종종 이러한 복합 테이블의 이름은 Entity1_has_Entity2입니다. 방법 삭제 가 ProductBLL 배치되어야하며 다음과 같을 수있다이 경우

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

:

public void Delete(int id) 
{ 
    // delete the _has_ relations - there is no connection between product and category anymore 
    productBLL.DeleteCategoriesForProduct(id); 
    productBLL.DeleteProduct(id); 
} 
[Product_has_Category] 
[ProductId] PK, NOT NULL 
[CategoryId] PK, NOT NULL 

분류 10, 13, 5 PRODUCTID 1 가득

표시 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()를 호출해야합니까? –

+0

@Giang 제 제안은 Product와 Category 사이의 관계를 쉽게 ** n에서 n **까지의 관계를 가능하게하기 위해 하나의 새로운 테이블을 소개합니다. 나는 코드가 중복되어 있다고 생각하지 않는다. "카테고리 BLL이 처음 생성되었습니다"란 정확히 무슨 뜻입니까? ** ShowCategoriesForProduct ** 메소드에는 ** 모든 ** 가능한 카테고리가 아닌 제품이 지정된 카테고리 만 가져옵니다. categoryBLL.GetCategories()를 호출하면 현재 선택한 제품에 대해 표시 할 카테고리를 어떻게 알 수 있습니까? – pasty

관련 문제