2013-04-11 241 views
2

我試圖映射兩個表:功能NHibernate複合映射

  • 第一個有一個id(IDA)和場與其他表的ID(IDB)。
    • 另一個具有基於先前的ID(IDB)和另一個(idB2)複合鍵

的想法是,在第二個表包含在多個的分割的說明行。

我目前的實現如下,但我無法檢索concatenation所需的partialDescription。 我應該如何改變我的地圖工作?有任何想法嗎? :)

public class A 
{ 
    long idA 
    lond idB 
    string fullDescription 
} 


public class B 
{ 
    long idB 
    long idB2 
    strind partialDescription 
} 

public class AMap : ClassMap<A> 
{ 
    public AMap() 
    { 
     Table("A"); 
     Id(x => x.id).Column("idA").GeneratedBy.Native(); 
     Map(x => x.idB).Column("idB") 
     HasMany(x => x.B).KeyColumn("idB").Inverse().Cascade.All().Not.LazyLoad(); 
    } 
} 

public class BMap : ClassMap<B> 
{ 
    public BMap() 
    { 
     Table("B"); 
     CompositeId() 
      .KeyReference(x => x.A, "idB") 
      .KeyProperty(x => x.idB2, "idB2"); 
     Map(x => x.partialDescription, "desc").CustomType("AnsiString"); 
    } 
} 

回答

1

事實上,通過你的描述,你必須有這樣的另外一種情況:

public class A 
{ 
    public virtual long Id { get; set; } 
    public virtual IList<B> PartialDescriptions { get; protected set; } 
    public string fullDescription 
    { 
     get 
     { 
      StringBuilder description = new StringBuilder(); 
      foreach (var partial in PartialDescriptions) 
      { 
       description.Append(partial); 
      } 

      return description.ToString(); 
     } 
    } 
} 

public class B 
{ 
    public virtual long Id { get; set; } 
    public virtual long Id2 { get; set; } 
    public virtual string Description { get; set; } 
} 

然後,嘗試實現這樣的類圖:

public class BMap : ClassMap<B> 
{ 
    public BMap() 
    { 
     Table("B"); 
     CompositeId() 
      .KeyReference(x => x.Id, "idB") 
      .KeyProperty(x => x.Id2, "idB2"); 
     Map(x => x.partialDescription, "desc").CustomType("AnsiString"); 
    } 
} 

public class AMap : ClassMap<A> 
{ 
    public AMap() 
    { 
     Table("A"); 
     Id(x => x.Dd).Column("idA").GeneratedBy.Native(); 
     HasMany(x => x.PartialDescriptions) 
      .KeyColumn("idB") 
      .Inverse() 
      .Cascade.All() 
      .Not.LazyLoad(); 
    } 
} 

注意:我沒有試圖編譯這段代碼。我只希望你能接納將軍。

我建議你看看Fluent NHibernate的Getting started section以獲得更多信息。

+0

非常感謝你!我不得不修改你的代碼,但你的想法很好。 :)) – user2271375 2013-04-12 15:53:16