2011-04-27 43 views
1

Fluent-NHibernate를 처음 사용했습니다. 내 문제는 두 엔티티간에 일대 다 관계를 설정하려는 것입니다. 제품은 여러 (고유 한) 개정을 가질 수 있으며 특정 개정은 하나의 제품에만 속합니다. 예를 들어, Product1에는 개정 "a"및 개정 "b"가 있지만 두 개의 개정 "a"를 가질 수는 없습니다. 그건 내 클래스 정의의 모습 내용은 다음과 같습니다UniqueKey 제약 조건과 일대 다 관계

public class Product 
{ 
    public virtual int ID {get; private set;} 
    public IList<ProductRevision> revisions { get; set; } 

} 


public class ProductRevision 
{ 
     public virtual int ID {get; private set;} 
     public Product isRevisionOf { get; set; } 
     public virtual string revision { get; set; } 
} 

다음은 ProductRevision 테이블에 내 매핑

public class ProductMap : ClassMap<Product> 
{ 

    public ProductMap() 
    { 

     Id(x => x.ID).Column("ProductNo"); 
     HasMany(x => x.revisions).Cascade.All(); 
    } 

} 

public class ProductRevisionMap : ClassMap<ProductRevision> 
{ 
    public ProductDefinitionFormationMap() 
    { 
     Id(x => x.ID); 
     References(x => x.isRevisionOf).UniqueKey("Product_Revision").Not.Nullable(); 
     Map(x => x.revision).UniqueKey("Product_Revision").Not.Nullable(); 

} 

} 

내가 지금 얻을 것은 중복 열 "PRODUCT_ID"입니다입니다. 내가 양쪽에 hasMany() 및 references()를 사용하여 관계를 정의하면 뭔가 잘못되었습니다. 일반적으로 References (...) 매핑을 정의하지 않지만 uniquekey 제약 조건에 대해 필요합니다.

덕분에, 에릭

+0

기본/외래 키에 관한 한이 두 테이블의 모양이 같습니다. 나는 당신이 이것을 필요 이상으로 복잡하게 만들고 있다고 생각하고 있습니다. –

답변

0

이 양방향 일대 다 관계이며, 매핑은 다음과 같이 보일 수 있습니다

public ProductMap() 
{ 
    Id(x => x.ID).Column("ProductNo"); 
    HasMany(x => x.revisions) 
     .KeyColumn("ProductId") // the name of the FK column in ProductRevision table 
     .Inverse() // bi-directional relation 
     .Cascade.All(); 
} 

public ProductRevisionMap() 
{ 
    Id(x => x.ID); 
    References(x => x.isRevisionOf) 
     .Column("ProductId") // column name must match the name specified in Product HasMany 
     .UniqueKey("Product_Revision") 
     .Not.Nullable(); 
    Map(x => x.revision).UniqueKey("Product_Revision").Not.Nullable(); 
} 

역 및 KeyColumn이 퍼즐의 빠진 부분입니다.

이 매핑은 데이터베이스에 필수 제약 조건을 생성하지만 비즈니스 논리에서이 제약 조건을 확인해야합니다. 그렇지 않으면 중복 이름이있는 수정 버전이 개정 컬렉션에 삽입되는 경우 SqlException이 발생합니다.

+0

고마워, 그랬어! –