2010-04-25 3 views
2

위의 기술을 사용하여 만든 Im은 설계상의 문제입니다.SQL, MVC, Entity Framework

내 DB에 아트웍 테이블이 있으며 장바구니 + CartLine 테이블에 예술 작품 (이제는 디지털 제품이라고 생각합니다)을 추가 할 수있었습니다. 내가 가지고있는 시스템은 미술관과 사용자 계정 등에 미술 작품을 추가하는 데 적합합니다.

이제 고객은 '하드웨어 제품'테이블을 작성하기 위해 '하드웨어 제품'이라는 티셔츠, 머그컵 및 펜 등을 판매하려고합니다.

두 테이블에 두 가지 제품 유형이 있습니다. 나는 HardwareProducts 테이블과 Artwork 테이블 모두에서 PK의 GUID를 사용합니다. 고객이 카트에 항목을 추가하면 CartItems 테이블의 ProductID 열에 GUID가 저장됩니다.

문제는 데이터베이스에서 ORM을 통해 LineItem 개체를 프런트 엔드로 가져올 때 참조 할 테이블을 알 수 없다는 것입니다.

OOP에서 어떻게 Product의 기본 클래스를 얻었는지, 그리고 DigitalProduct 클래스와 HardwareProduct 클래스가 어떻게 변형 되었는지를 볼 수 있습니다. 그러나 SQL Server와 Entity Framework에서이를 모델링하는 방법은 무엇입니까? 방법?

편집 :

이것은 내가 아래의 의견에 순간 덕분에 테스트 응용 프로그램에있는 것입니다. 나를 위해했던 속임수는 Stephane이 지적한 것에 ORM 시뮬레이션을 활용했습니다. 나는 this 우수 기사로 인도합니다. 내 주요 솔루션에 통합하고 난 더 이상 소견이있는 경우 사용자에게 알려줍니다에 대한 생각

int prodCount = _entities.Product.OfType<ArtWork>().Count(); 
IEnumerable<LineItem> lineItem = _entities.LineItem.Include("Product"); 
int artWorkCount = lineItem.Select(p => p.Product).OfType<ArtWork>().Count(); 

ArtWork prod = new ArtWork(); 
      prod.Price = 2; 
      prod.ProductName = "atlast"; 
      prod.Downloads = 3; 
      prod.GalleryID = 1; 
      _entities.AddToProduct(prod); 
      _entities.SaveChanges(); 

,하지만 난 모든 좋은 찾고 생각 :

alt text http://img411.imageshack.us/img411/3568/32654541.jpg

이 있습니다 . 주의 말한 Type 열이 실제로 ORM이 제공 한 깨끗한 솔루션 덕분에 실제로 필요하지는 않습니다. Thx 모두

+0

매우 흥미로운 시나리오를 참조하십시오. 나는 해결책을 너무 배우기를 원한다. – Raja

+0

위대한 정보입니다. LukLed & Stephane. 내 고객 요청이 내 DB에 디자인 문제를 도입 한 것을 깨달았습니다. (실제로는 ecom DB가 아니었지만 빠르게 성장했습니다.) 우리는 솔루션 통합을 조사하기 위해 이야기 할 때 배경을 읽는 중입니다 (Stephane 및 매핑 다시). 일단 테스트 프로젝트를 작성하면 다시 돌아올 것입니다. – Anthony

+0

EF로 재미있게 놀아 라 :) –

답변

1

이것은 EntityFramework의 한 기능을 과시하는 매우 멋진 시나리오입니다!

단일 테이블 제품과 제품 유형을 정의하는 유형 열이있을 수 있습니다. 그런 다음 엔터티 데이터 모델에서 기본 엔터티 Product를 정의하고 2 개의 파생 엔터티 인 HardwareProduct 및 ArtProduct를 만듭니다. 당신과 같이 당신의 아이 엔티티의 매핑에 조건을 추가 할 수 있습니다

편집 : 당신은 을 읽어야 할 때 ProductTypeID = 1,하지만 지금 스크린 샷을 다시 게으른 해요)

inherited entity and condition http://i42.tinypic.com/2ibhqw3.png

이 :) "ProductTypeID = 1"

2

데이터베이스 디자인이 좋지 않습니다. 기본 테이블에는 모든 제품의 ID와 공통 기능 및 다양한 유형의 제품에 대한 기능이있는 확장 테이블이 있어야합니다.

예 :

제품 : ID, 설명, 단가, ProductType (작품 또는 하드웨어)
작품 : 제품 ID, 년도, 크기
HardwareProduct : 제품 ID, 다른 기능을 제공합니다.

카트에는 제품 ID와 수량이 저장됩니다.

더 많은 카테고리의 제품이있을 수 있으므로 제품 범주에 특정한 매개 변수를 저장하는 테이블과 그 값을 저장하는 다른 테이블을 고려해야합니다.

그리고 OOP 솔루션에 대한 의견. DigitalProduct 및 HardwareProduct 클래스는 처음에는 흥미로울 수 있지만 상점의 항목에는 여러 가지 기능이있어서 다른 클래스로 변환 할 수 없습니다.펜에는 색이 있고, 티셔츠에는 크기가 있고 머그컵에는 용량이 있습니다. 그래서 생각하기 시작할 때 머그와 티셔츠 사이에 차이가 있습니다. 그런 다음 아트 워크와 티셔츠 사이에 차이가 있습니다. 그런데 어딘가에 티셔츠와 예술품이있는 같은 장소에 머그컵이있는 이유는 무엇입니까?

분명히 오픈 소스 전자 상거래 솔루션을 살펴보고 거기에서 어떻게 수행되는지보십시오. 고객은 다른 유형의 제품을 판매하기를 원할 수 있으며 더 보편적 인 솔루션을 고안해야합니다. 다른 클래스를 추가하는 것은 효율적이지 않습니다.

+1

이 엔티티 모델의 상속과 결합하여 괜찮았다. :) –