2010-08-18 1 views
2

처음에는 ORM, nhibernate 및 FHN을 처음 사용했습니다. 나는 며칠 동안이 물건을 조사한다. Nhibernate - CompositeId로 DomainObjects와 Mapping을 디자인하는 방법

alt text

그래서 내가 Auswahl 및 RefAuswahlFilter 일하러 먼저 시도 : 내가 4 개 테이블이 기존 데이터베이스가 있습니다. 여기

내 DomainObjects 있습니다 : PLS 내가 할 수있을 때 알려이 더 나은 여기

[Serializable] 
public class Auswahl 
{ 
    public Auswahl() 
    { 
     this.RefFilters = new List<RefAuswahlFilter>(); 
    } 

    public virtual IList<RefAuswahlFilter> RefFilters { get; set; } 

    //...rest of the Properties 

[Serializable] 
public class RefAuswahlFilter 
{ 
    public virtual Auswahl Auswahl { get; set; } 
    public virtual long Filterrank { get; set; } 
    public virtual string Filter { get; set; } 

내 매핑이 : 난 내 응용 프로그램을 실행하면 내가 가진 목록을 가지고

public class AuswahlMap : ClassMap<Auswahl> 
{ 
    public AuswahlMap() 
    { 
     Table("AUSWAHL"); 

     Id(x => x.Id) 
      .GeneratedBy.Sequence("SEQ_AUSWAHL"); 

     Map(x => x.Programm); 
     Map(x => x.Variante); 
     Map(x => x.Returnkey); 
     Map(x => x.Beschreibung); 

     HasMany<RefAuswahlFilter>(x => x.RefFilters); 

    } 
} 

public class RefAuswahlFilterMap : ClassMap<RefAuswahlFilter> 
{ 
    public RefAuswahlFilterMap() 
    { 
     Table("REFAUSWAHLFILTER"); 

     CompositeId() 
      .KeyReference(x => x.Auswahl,"IDAUSWAHL") 
      .KeyProperty(x => x.Filterrank,"FILTERANK"); 

     Map(x => x.Filter); 
    } 
} 

내 모든 행 Auswahl.

var l = session.CreateCriteria(typeof(Auswahl)).List<Auswahl>(); 

하지만 난 디버거가 다음과 같은 오류 보여 RefFilters 얻을 항목으로 볼 때 :

의 InnerException { "ORA-00904를 : \" ". \"REFFILTERS0 \ AUSWAHL_ID \ " ungültiger Bezeichner \ n을 "}

컬렉션을 초기화 할 수있다 : [ORMTest.DomainModel.Auswahl.RefFilters 번호 1097] [SQL : FILTERANK1_ 같은 Auswahl4_1_, IDAUSWAHL1_ 같은 reffilters0_.IDAUSWAHL, reffilters0_.FILTERANK로 reffilters0_.Auswahl_id을 선택 reffilters0_ .IDAUSWAHL을 (를) IDAUSWAHL3_0_, reffilters0_.FILTERANK을 (를) FILTERANK3_0_, reffilters0_.Fil ter as Filter3_0_ FROM REFAUSWAHLFILTER reffilters 0_ 어디에서 reffilters0_.Auswahl_id =?]

그래서 내 매핑에 뭔가가 잘못 생각하지만, 난 정말 못해.

xx.

+0

시도를 좋은하지 보인다. HasMany (x => x.RefFilters); 구문이 여전히 작동하는지 확신 할 수 없습니다. – rebelliard

답변

2

잘 부분적으로 성공했습니다. DB에서 읽는 것은 지금 작동합니다.

public AuswahlMap() 
    { 
     Table("AUSWAHL"); 

     Id(x => x.Id,"ID") 
      .GeneratedBy.Sequence("SEQ_AUSWAHL"); 

     Map(x => x.Programm); 
     Map(x => x.Variante); 
     Map(x => x.Returnkey).Not.Nullable(); 
     Map(x => x.Beschreibung); 

     HasMany(x => x.RefFilters) 
      .Inverse() 
      .Cascade.All();  
    } 

public RefAuswahlFilterMap() 
    { 
     Table("REFAUSWAHLFILTER"); 

     CompositeId() 
      .KeyReference(x => x.Auswahl,"IDAUSWAHL") 
      .KeyProperty(x => x.Filterrank); 

     Map(x => x.Filter); 

     References(x => x.Auswahl) 
      .Column("IDAUSWAHL") 
      .Not.Nullable(); 
    } 

DB에 저장하는 것은 지금까지 빈 List (RefFilters)와 작동하기 때문에 지금 살펴 봐야합니다. 이건 내 기록에서 나온거야. 난 정말 모르겠어 "NHibernate.Type.Int64Type - 매개 변수에 바인딩 '1'3 14 : 31 : 18.585 [9] DEBUG"에서 온 "하지만 이것은 지금까지 예외입니다.

14 : 31 : 18.397 [9] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - 삽입 엔티티 : ORMTest.DomainModel.RefAuswahlFilter # ORMTest.DomainModel.RefAuswahlFilter] 14 : 31 : 18.413 [9] DEBUG NHibernate.AdoNet .AbstractBatcher - 새 IDbCommand를 열고 IDbCommands를 엽니 다. 1 14 : 31 : 18.413 [9] DEBUG NHibernate.AdoNet.AbstractBatcher - SqlString에 대한 IDbCommand 개체 만들기 : INSERT INTO REFAUSWAHLFILTER (필터, IDAUSWAHL, Filterrank) VALUES (?,? ,?) 14 : 31 : 18.413 [9] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - 탈수 엔티티 : [ORMTest.DomainModel.RefAuswahlFilter # ORMTest.DomainModel.RefAuswahlFilter] 14 : 31 : 18.413 [9] DEBUG NHibernate.Type .StringType - 'fh'를 매개 변수로 바인딩 : 14:31 : 18.413 [9] DEBUG NHibernate.Type.Int64Type - 매개 변수에 '1446'바인딩 : 1 14 : 31 : 18.413 [9] DEBUG NHibernate.Type.Int64Type - 매개 변수에 '1446'바인딩 : 14 : 31 : 18.413 [9] DEBUG NHibernate.Type.Int64Type - 매개 변수에 '1'을 바인딩 3 14 : 31 : 18.585 [9] DEBUG NHibernate.AdoNet.AbstractBatcher - 닫힌 IDbCommand, 열린 IDbCommands : 0 14 : 31 : 18.647 [9] DEBUG NHibernate.AdoNet.은 ConnectionManager는 - 플러시 끝을

편집 등록 : 예상처럼 내가

public RefAuswahlFilterMap() 
    { 
     Table("REFAUSWAHLFILTER"); 

     CompositeId() 
      .KeyReference(x => x.Auswahl,"IDAUSWAHL") 
      .KeyProperty(x => x.Filterrank); 

     Map(x => x.Filter); 
    } 

절약 작품 내 매핑을 변경 합니다. 그럼에도 불구하고 NHibernate에 프로파일 러는 약간의 경고를 표시하고 RefAuswahlFilter에 대한 내 선택은 hasMany의에서 을 제거 :

SELECT reffilters0_.IDAUSWAHL as IDAUSWAHL1_, 
     reffilters0_.Filterrank as Filterrank1_, 
     reffilters0_.IDAUSWAHL as IDAUSWAHL3_0_, 
     reffilters0_.Filterrank as Filterrank3_0_, 
     reffilters0_.Filter  as Filter3_0_ 
FROM REFAUSWAHLFILTER reffilters0_ 
WHERE reffilters0_.IDAUSWAHL = 1 /* :p0 */ 
관련 문제