2012-08-01 2 views
3

내 응용 프로그램에는 제품과 공급 업체가 있으며 두 제품 모두 "관련있는"관계로 비슷한 항목이 있습니다 ... 특히 사용자가 즐겨 찾기에 추가 할 수 있도록 "즐겨 찾기"가 있습니다.asp.NET MVC 3 복합 패턴 모델 바인딩

public class Product 
{ 
    public int ProductId {get;set;} 
    public int Name {get;set;} 
    public List<Favorite> Favorites {get;set;} 
} 

public class Vendor 
{ 
    public int VendorId {get;set;} 
    public int Name {get;set;} 
    public List<Favorite> Favorites {get;set;} 
} 

public class Favorite 
{ 
    public int FavoriteId {get;set;} 
    public string UserName {get;set;} 
} 

이 처음이 작동하지 않았다, 그래서 나는 추가 :

그래서 우리는이
public int? VendorId {get;set;} 
    public int? ProductId {get;set;} 

지금 내가 데 문제가 나의 Vendor.Favorites 및 제품. 즐겨 찾기는 항상 null입니다.

어떻게 이러한 개체를 사용하여 이러한 개체를 사용할 수 있습니까? 별도의 법인으로 만들지 않습니까?

감사합니다.

업데이트 : MVC 3 코드 우선을 POCO와 함께 사용하고 있음에 유의해야합니다.

UPDATE : 솔루션 :

나는이 생각하지 않습니다 아직도 내가 뭔가를 즐겨 찾기 및 리뷰를 추가 중복 코드를 추가하기 때문에이 작업을하는 방법으로 단점을 보완 작업에 이상적입니다.

public class Product 
{ 
    public int ProductId {get;set;} 
    public int Name {get;set;} 
    public virtual List<Favorite> Favorites {get;set;} 
} 

public class Vendor 
{ 
    public int VendorId {get;set;} 
    public int Name {get;set;} 
    public virtual List<Favorite> Favorites {get;set;} 
} 

클래스가 작동하게 즐겨 찾기에 원시 널 (NULL)의 INT 변수를 갖는,하지만 난 다른 물체로 즐겨 찾기 클래스를 사용하기를 원한다면 나는의 키에 새로운 매핑 즐겨 찾기 속성을 수정해야합니다 그 물체. 호기심에서 이러한 클래스를 정상적으로 처리 할 때 이러한 객체에 대한 데이터 저장소는 어떻게 관리합니까? DAL에서 처리한다고 가정하고 있습니까?

답변

0

EF 4를 사용하고 있다고 가정합니다.1 : 나는 그런 다음 FK 관계를 모두 설정해야합니다

public virtual Vendor VendorId {get;set;} 
    public virtual Product ProductId {get;set;} 

public int? VendorId {get;set;} 
    public int? ProductId {get;set;} 

를 변경할 것을 제외하고

당신의 모델은 꽤 좋아 보인다. EF에 대한 나의 이해에 따라 List<Favorite>은 관계를 설정하기위한 것이지 실제로 채워지지 않습니다. 당신은 상황에 .Include()를 호출하거나 데이터베이스에 생성 EF 귀하의 경우 어떤이 VendorId_FavoriteId 또는 ProductId_FavoriteId

+0

이것은 거꾸로 끝나지 만 올바른 곳에서 나를 잡았습니다. int가 필요합니다. 응용 프로그램이 원시 매핑을 가질 수 있고 순환 참조가 없습니다 (끔찍한). 공용 목록 을 공개 가상 목록 으로 변경하여 모든 사용자가 만족 스러웠습니다. – Snowburnt

1

상속을 사용하여 Favorite 만 포함하는 기본 클래스를 만든 다음 다른 정보를 기반으로 클래스를 파생시킬 수 있습니다. 이로써 "is a"관계가 성립됩니다.

Ex.

public class baseClass 
{ 
public list<Favorite> Favorites { get; set;} 
} 
public class Product : base 
{ 
public int ProductID { get; set; } 
public string Name { get; set; } 
} 

그런 다음 제품 개체에는 3 가지 속성이 모두 있습니다.

+0

될 것이라고 실제 FK를 참조하여 중, 스스로를 채울 수 있고 그때 리뷰와 같은 다른 공유 조각을 가질 수있다 기본 클래스의 주석? 나는이 변화를 고려할 것이다. 이 스타일을 사용해 본 적이 있습니까? 엔티티에 데이터를 가져 오기 위해 특별한 작업을 수행해야합니까? – Snowburnt

+0

예, 기본 클래스에 넣은 모든 것은 파생 된 객체에서 해당 객체의 클래스의 속성 인 것처럼 활용할 수 있습니다. 완전히 투명하고 동적입니다. 유형간에 변환하고 공통 데이터를 유지할 수 있습니다. 한 필드에서만 다른 매우 유사한 두 개의 항목을 사용할 때이 스타일을 사용했습니다. 예를 들어 파트와 패키지를 다루는 직장의 프로젝트에서 "packagenumber"/ "partnumber"필드를 제외하고는 동일합니다. 이들을 제외한 모든 필드는 기본 클래스로 이동 한 다음 패키지 및 파트 클래스에 각각 "packagenumber"/ "partnumber"가 들어갑니다. –

+0

데이터베이스가 서로 다른 클래스를 구분하는 방법은 무엇입니까? 그것은 별도의 테이블을 가지고 있습니까? – Snowburnt

0

나는 ID의 (VendorID 값 또는 제품 ID 중 하나)를 저장하는 하나의 속성을 유지하고 (Vendor 또는 Product가)

public class Favorite 
{ 
    public int FavoriteId {get;set;} 
    public string UserName {get;set;} 
    public int ItemID { set;get;} //can use a better generic name 
    public FavoriteType Type { set;get;} 
} 

나는 유형

에 대한 Enum이 어떤 종류 말해 다른 속성을 사용합니다
public enum FavoriteType 
{ 
    Vendor, 
    Product 
} 

그리고 당신은/그 접근 그것은 null 참조 예외가 발생하지 않도록 이들에 대한 방법을 적용하기 전에 하위 속성을 초기화되어 있는지 확인하십시오! 당신은 그것을 생성자 자체로 할 수 있습니다.

public class Product 
{ 
    public int ProductId {get;set;} 
    public int Name {get;set;} 
    public List<Favorite> Favorites {get;set;} 

    public Product() 
    { 
     if(Favourites==null) 
      Favorites=new List<Favorite>(); 
    } 
} 
+0

내가 nullable 외래 키 또는 discriminator 필드로 이동하는지 여부는 여전히 100 % 확장 가능하지 않지만 그로 괜찮습니다. 그래서 목록을 초기화해야합니다. 작성해야합니까, 아니면 MVC3이 나를 위해할까요? – Snowburnt

+0

나는 FavoriteType enum에 동의하지 않습니다. 가장 좋아하는 사람은 그 사람이 그 타입인지 모를 것입니다. 이것은 잠재적으로 Liskov 대체 원칙을 깨뜨릴 수 있습니다. 즐겨 찾기가 검색되는 컨텍스트는 즐겨 찾기 유형을 결정합니다. 또한 Product 생성자에서는 null coalesce'Favorites? new List ()' –

+0

null 생성자를 추가하고 다시 사용하려고했습니다. 데이터베이스를 확인한 결과 제품 테이블의 항목과 일치하는 즐겨 찾기 테이블의 항목이 있습니다. 내가 좋아하는 제품을 참조 할 때 0 카운트라고한다. – Snowburnt