2010-08-18 20 views
2

起初,我對ORM,nhibernate和FHN真的很陌生。我現在仔細研究這些東西。 我有4代表的現有數據庫:Nhibernate - 如何使用CompositeId設計DomainObjects和映射

alt text

,所以我第一次嘗試獲得Auswahl和RefAuswahlFilter工作。

這裏是我的DomainObjects:請讓我知道什麼時候我能做到更好

[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ültigerBezeichner \ n「}

無法初始化集合:[ORMTest.DomainModel.Auswahl.RefFilters#1097] [SQL:SELECT reffilters0_.Auswahl_id爲Auswahl4_1_,reffilters0_.IDAUSWAHL爲IDAUSWAHL1_,reffilters0_.FILTERANK爲FILTERANK1_,reffilters0_ .IDAUSWAHL爲IDAUSWAHL3_0_,reffilters0_.FILTERANK爲FILTERANK3_0_,reffilters0_.Fil ter作爲Filter3_0_從REFAUSWAHLFILTER reffilters0_ WHERE reffilters0_.Auswahl_id =?]

所以我認爲我的映射是錯誤的,但我真的沒有得到它。

thx。

+0

嘗試消除的hasMany的。 HasMany(x => x.RefFilters); 不確定該語法仍然有效。 – rebelliard 2010-08-18 12:20:05

回答

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(); 
    } 

保存到數據庫只是一個空的列表(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(Filter,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'綁定到參數:0 14:31 :18.413 [9] DEBUG NHibernate.Type.Int64Type - 綁定'1446'參數:2 14:31:18.413 [9]調試NHibernate.Type.Int64Type - 綁定'1446'參數:1 14:31:18.413 [9] DEBUG NHibernate.Type.Int64Type - 綁定'1'參數:3 14:31:18.585 [9]調試NHibernate.AdoNet.AbstractBatcher - 關閉IDbCommand,打開IDbCommands:0 14:31:18.647 [9]調試NHibernate.AdoNet。的ConnectionManager - 註冊沖刷結束

編輯: 如果我改變我的映射

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

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

     Map(x => x.Filter); 
    } 

節能工程預計一樣。不過NHibernate的探查顯示了一些警告和我的RefAuswahlFilter選擇看起來不是很好:)

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 */