2011-08-26 53 views
1

考慮類A,B和C,A和B都有一個Cs的集合。我想將這些集合映射到不同的表,所以我有表A_C和B_C。我試着做:FluentNhibernate,地圖類到多個表

public class AMap : ClassMap<A> 
{  
    Public AMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     HasMany(x => x.Cs).Table("A_C"); 
    } 
} 

public class BMap : ClassMap<B> 
{  
    Public BMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
     HasMany(x => x.Cs).Table("B_C"); 
    } 
} 

public class CMap : ClassMap<C> 
{  
    Public CMap() 
    { 
     Id(x => x.Id).GeneratedBy.Identity(); 
    } 
} 

..(有一些額外的屬性),但它仍然創建一個名稱爲「C」的單個表。那麼對此的正確方法是什麼?

回答

1

我會說,繼續前進,讓你單獨的表(不需要使用模式導出),並正確地配置你的映射方式,你知道他們應該工作。只要你正確地配置了一些東西,NHibernate就應該弄明白。您可能必須告訴它要加入的關鍵字列的名稱。您仍然可以使用模式導出來生成其他表。完成後,進入NHibernate並添加額外的表。

public class AMap : ClassMap<A> 
{  
    Public AMap() 
    { 
     // ... 
     HasMany(x => x.Cs).Table("A_C").KeyColumn("TheNameOfA'sPrimaryKeyColumn"); 
    } 
} 

public class BMap : ClassMap<B> 
{  
    Public BMap() 
    { 
     // ... 
     HasMany(x => x.Cs).Table("B_C").KeyColumn("TheNameOfB'sPrimaryKeyColumn"); 
    } 
} 

NHibernate應該正確地連接。讓我知道如果它不。另外,如果你正在處理複合密鑰並需要幫助,請告訴我。

+0

如果您接受來自NHibernate的預失真,則不需要指定KeyColumn。它只是想出來。像A_Id和B_Id。這通常是它爲外鍵生成列名稱的方式。 –

+0

哦,這樣理解正確;根本不可能從映射中獲得自動生成的表格,而且在使用自定義表格名稱時不能通過模式導出來獲取表格。 – bretddog

+0

呃......我不確定。它應該實際上在工作。爲什麼不是,需要額外的配置?我不知道。但看起來像上面的設置應該肯定會得到它來生成單獨的表。關於模式導出的事情就是它有點像一次性的事情。一旦它產生你的數據庫,你會想保留該腳本的副本。這是一件非常方便的事情,因爲當您確實決定使用它時,您將始終獲得一個能夠準確反映數據模型最新版本的腳本。但只要你的桌子不變,你就很好。 –