0

在我的數據庫中,我有兩個表,其中一個邏輯引用其他表,但沒有定義外鍵(我無法控制數據庫,因此必須忍受這一點)。例如: -Fluent Nhibernate中的自定義引用映射

Table1 (
    Table1Id int, 
    Column1 int, 
    Column2 int 
) 

Table2 (
    Table2Id int, 
    Column1FromTable1 int, 
    Column2FromTable1 int 
) 

假設有保證(Column1, Column2)對是Table1獨特。

在代碼中,我想定義HasMany映射Table1,像這樣:

public class Table1 
{ 
    public int Id 
    { 
     get; 
     set; 
    } 

    public IEnumerable<Table2> Table2s 
    { 
     get; 
     set; 
    } 
} 

public class Table2 
{ 
    public int Id 
    { 

    } 

    public Table1 Table1 
    { 
     get; 
     set; 
    } 

} 

public class Table1Map : ClassMap<Table1> 
{ 
    public Table1Map() 
    { 
     Id(x => x.Id).Column("Table1Id"); 
     HasMany(x => x.Table2s); //What next? 
    } 
} 

我有什麼該怎麼辦?我可以使用什麼方法OneToManyPart來定義參考?

簡而言之,用流利的NHibernate,我該如何綁定不綁定在數據庫中的代碼實體?問題也在於我必須在這裏使用的複雜關鍵。

再次,我不能在這種情況下更改數據庫,否則這將是我的自然選擇。

回答

1

您需要Col1 & Col2映射爲一個這樣的組合鍵:

public class Table1Map : ClassMap<Table1> 
{ 
    public Table1Map() 
    { 
     UseCompositeId() 
       .WithKeyProperty(x => x.Column1 , "Column1") 
       .WithKeyProperty(x => x.Column2 , "Column2"); 
     HasMany(x => x.Table2s) 
       .WithKeyColumn("Column1FromTable1") 
       .WithKeyColumn("Column2FromTable1") ; 
     Map(x => x.Id).Column("Table1Id"); 
    } 
} 

,並在映射Table2

public class Table2Map : ClassMap<Table2> 
{ 
    public Table2Map() 
    { 
     Id(x => x.Id).Column("Table2Id"); 
     References(x => x.Table1) 
       .WithColumns("Column1FromTable1", "Column2FromTable1") ; 
    } 
} 
+0

謝謝!這絕對是正確的,但在我真的能測試映射之前,我還有很長的路要走,所以我會記住稍後接受你的答案,當映射被證明是可行的。 –

+0

還有一個問題是:我需要將Column1和Column2添加到Table1類定義中,沒有辦法避免這種情況,是嗎? –

+0

我想你不得不 – Variant

相關問題