2013-01-23 110 views
1

我有一個無法映射到一個顯式表的類。它所映射的表取決於使用它的上下文。基本上它應該如同我試圖將IDictionary<string, int>綁定到表格一樣工作。將類映射到多個表

// this is a mapped entity, with a Guid Id, but it can't be mapped to one explicit table 
public class NoTableClass : Entity<Guid> 
{ 

} 

// the table that this class gets its MyCollectionContext1 from depends on the HasMany mapping for that property 
public class MappedClass1 : Entity<Guid> 
{ 
    public IEnumerable<NoTableClass> MyCollectionContext1 { get; set; } 
} 

// the table that this class gets its MyCollectionContext2 from depends on the HasMany mapping for that property 
public class MappedClass2 : Entity<Guid> 
{ 
    public IEnumerable<NoTableClass> MyCollectionContext2 { get; set; } 
} 


// Mapping overrides 

public void Override(AutoMapping<MappedClass1> mapping) 
{ 
    mapping.HasMany(Reveal.Member<MappedClass1, IEnumerable<NoTableClass>>("MyCollectionContext1")) 
     .Table("Table1") 
     .Access.Field() 
     .Cascade.AllDeleteOrphan(); 
} 

public void Override(AutoMapping<MappedClass2> mapping) 
{ 
    mapping.HasMany(Reveal.Member<MappedClass2, IEnumerable<NoTableClass>>("MyCollectionContext2")) 
     .Table("Table2") 
     .Access.Field() 
     .Cascade.AllDeleteOrphan(); 
} 

好像忽略了NHibernate的集合時有一個自定義類.Table()映射方法。我不明白爲什麼可以用這種方式映射簡單類型的字典,但是具有自定義類的集合不能。

注意:我有我的理由不想使用繼承/泛型來解決這個問題,並且不想讓我映射到每個表的具體類型。我們有一個使用泛型的工作解決方案,但它爲我們創造了其他問題。

回答

2

我認爲你正在嘗試做的可以用組件來實現:

public static void Override(AutoMapping<MappedClass1> mapping) { 
    mapping.HasMany(Reveal.Member<MappedClass1, IEnumerable<NoTableClass>>("MyCollectionContext1")) 
      .Component(c => { 
       c.Map(x => x.Id); 
       c.Map(x => x.Name); 
      }) 
      .Table("Table1") 
      .Cascade.AllDeleteOrphan(); 
} 

public static void Override(AutoMapping<MappedClass2> mapping) { 
    mapping.HasMany(Reveal.Member<MappedClass2, IEnumerable<NoTableClass>>("MyCollectionContext2")) 
      .Component(c => { 
       c.Map(x => x.Id); 
       c.Map(x => x.Name); 
      }) 
      .Table("Table2") 
      .Cascade.AllDeleteOrphan(); 
} 

這是一起玩的代碼:https://gist.github.com/4620069

+0

完美的作品,我一直在尋找這種解決方案爲期一天,謝謝你:)有一個問題。我看不出任何方法來映射'NoTableClass'的主鍵,以便每次插入都會生成一個新的'Guid'。這通常是通過擴展'Entity '或在類映射中通過使用'.Id()'來實現的。我可以在'.Component()'裏面做的唯一事情是'c.Map(x => x。 Id)'這將只是插入一個空的Guid。一旦我解決這個問題,我會接受你的答案。 –

+0

如果你所需要的只是'Guid'的生成,那麼你可以在'NoTableClass' contrsuctor:'thid.Id = Guid.NewGuid()'中生成它。 – SHSE

+0

我們真的不想在代碼中生成guid,我們的整個系統使用Guid作爲唯一標識符,並且在插入時由數據庫生成,我們不希望在代碼中生成id插入之前。 –