2009-08-27 11 views
2

다른 제품이 있습니다. 전혀 FNH 또는 NH로 매핑 할 수 있습니다 : 곱셈 값, 값 목록, 등 ...Fluent NHibernate : 서브 클래스 내부의 서브 클래스

public class Product : Entity 
    { 
    } 
    public class Quantity: Entity 
    { 
    } 
    public class ListQuantity : Quantity 
    { 
     public virtual IList<int> Quantities { get; set; } 
    } 
    public class MultiplierQuantity : Quantity 
    { 
     public virtual int Multiplier { get; set; } 
    } 
    public class AppProduct : Product 
    { 
     public virtual Quantity Quantity { get; set; } 
    } 

질문은 - 이제, AppProduct 서로 다른 양의 종류가? 특히, 자동 매핑. 내게는 자신의 테이블에 제품을 매핑하는 것이 자연스럽지 만, 수량은 AppProducts 테이블의 일부가됩니다. 즉, 차별화됩니다.

다른 Subclass, JoinedSubclass 등 행운없이 다른 NH 예외가있는 방식으로 시도했습니다. 조인 된 서브 클래스와 함께 두 계층 구조가 기본적으로 매핑되는 경우에만 작동합니다. 그러나 automapper는 IList [int]를 자동으로 매핑 할 수 없습니다. IList [제품]을 설정하면 (테스트 할 때) 모든 것이 완벽하게 작동합니다. 나는이 매핑을 사용하여 IList의 [INT]을 유지하려고하는 경우 :

public class ListQuantityMap : IAutoMappingOverride<ListQuantity> 
    { 
     public void Override(AutoMap<ListQuantity> mapping) 
     { 
     mapping.HasMany(x => x.Quantities).AsElement("QuantitiesId"); 
     } 
    } 

System.Xml.Schema.XmlSchemaValidationException에 실패했을 경우 요소 이름 공간에서 '클래스' '항아리 : NHibernate에 매핑-2.2'은 무효가 네임 스페이스 'urn : nhibernate-mapping-2.2'에서 자식 요소 'bag'. 예상 가능한 요소 목록 : 'urn : nhibernate-mapping-2.2'네임 스페이스의 'meta, subselect, cache, synchronize, comment, tuplizer, id, composite-id'

하지만 내 보낸 Orders.Core.Quantity.hbm.xml의 유일한 차이점은 일대 다 클래스 유형입니다. 즉, NHibernate는 거의 동일한 매핑에서 bag에 대해 불평하지 않습니다.
(참고 : 최근 FNH # 299에서 수정 된 버그 일 가능성이 높습니다.)

어쨌든 합류 된 하위 클래스는 완벽한 해결책이 아닙니다. 나는 AppProduct에서 단지 구성 요소를 수행하고 속성 "QuantityType"이 할당 될 때 적절한 수량 객체를 직접 생성한다고 생각합니다. 너무 이상합니다. 아니면 Linq2Sql로 전환하는 것이 도움이 될까요? ;-)

+0

이 모델을 매핑하려는 db 스키마를 포함하면 도움이 될 것입니다. 나는 당신의 의도가 그것 없이는 무엇인지 이해하기 위해 애 쓰고 있습니다. –

+0

스키마가 없으며 엔티티 및 FNH 생성 매핑을 기반으로 생성됩니다. 그래서 그것은 당신이 좋아하는 어떤 것이라도 될 수 있습니다. 또한 수동 HasMany 예외 문제는 최근의 FNH 개정판 (모든 하위 클래스에 삽입 된 무시)에서 수정 된 버그였습니다. – queen3

답변

1

나는 당신이 성취하려는 것을 잘 모른다. 개체 모델에 몇 가지 문제가있는 것 같습니다. 예를 들어, 수량 클래스 (int에서 파생 된 표준 속성과 반대)가있는 것처럼 보입니다. 이것을 다시 생각해 볼 수도 있습니다.

AutoMapper에서 문제가 발생하는 경우 규칙을 삭제하고 표준 (수동) 매핑을 사용할 수 있습니다.

Fluent-NHibernate 문제와는 반대로 객체 모델에서 문제가 발생할 가능성이 높습니다.

서브 클래스 매핑에서 공식적인 유창한 페이지는 http://wiki.fluentnhibernate.org/Fluent_mapping입니다.

+0

그것은 수량이 아니며, * n 또는 1,2,3, ... n이 될 수있는 "허용 된 수량"입니다. 그러므로 다른 전략 클래스 (그리고 어쩌면 3 번째 전략을 나중에 추가 할 것입니다). 이러한 여러 클래스는 GetNextAllowedQuanity()와 같은 메소드를 지원합니다. 나는 하나의 컴포넌트와 같은 클래스를 가질 수 있고 작동 할 것이다 ... 그러나 switch (quantityStrategy) 스타일에서는 그리 좋지도 않고 객체 지향도 아니다. – queen3

+0

확인. 나는 아직도 이해하지 못한다. "허용 된 양"이라고 말하면, 어떤 종류의 수량 유형을 의미합니까? 그것은 측정 단위와 같습니다 (예 : 각각, 온스, 케이스 등)?특정 유형의 제품에 대해 허용 할 수있는 유형 목록을 특정 수량에 연결할 수 있기를 원하는 것 같습니다. –

+0

글쎄, 사실 내 수량 유형은 코드 샘플에서 클래스로 표현됩니다 ... 각 수량 곱셈기 나 값 목록 일 수 있기 때문에 단일 수량 유형이 필요합니다. product1에는 Multiplier = 5 필드가 있고 AllowedProductQuantities (ProductId, Value) 테이블에는 값이없고 product2에는 Multiplier = null이 있고 AllowedProductQuantities 테이블에는 값이 거의 없습니다. Product (곱셈기) 필드가 있고 ProductMultiplers 테이블이 ProductId, Multiplier가되도록 Quantity를 Product의 Component로 만드는 방법을 살펴 보겠습니다. – queen3

관련 문제