2012-05-16 39 views
0

我有一個實體/類/表是從其他幾個實體引用的,我用Fluent NHibernate來處理ORM給我。在少數情況下,這是一個簡單的引用,我可以將外鍵ID存儲爲列,並以簡單的方式處理引用,但在其他幾個實例中,我需要引用這些項目的列表,並且需要完成此操作至少有三個我能想到的課程。你可以假設這個設置將被複制來處理其他類的關係。流利Nhibernate HasMany從幾個表中的一個表

下面是常見的實體的外觀(由其他幾個實體HasMany S投資的一個):

public class Student { 
    public virtual int Id {get; set;} 
    public virtual string Name {get; set;} 
} 

而且,這裏的ShopCourse實體是什麼樣子:

public class ShopCourse { 
    public virtual int Id {get; set;} 
    public virtual int Name {get; set;} 
    public virtual IList<Student> Students {get; set;} 
} 

想象我有一些其他課程,比如特定課程,可以「擁有」幾名學生。爲了保持這種關係,我必須在我的數據庫中創建一個表,以跟蹤兩者之間的外鍵(對於引用Student的每個實體) - 此中間表不需要實體,Fluent也不需要考慮它我把它表本身的字符串名稱:

表:ShopCourseStudents

int - ShopCourseId 
int - StudentId 

最後,這裏是我的映射。您可以假設實體本身的映射很好 - 諸如Id的命名方案等事情已解決並且正常工作。問題在於,當我嘗試初始化有任何實體HasManyStudent的:

//Inside a FluentlyConfigure().Mappings(m => m.AutoMappings.Add() call: 
.Override<ShopCourse>(map => { 
    map.HasMany(x => x.Students) 
     .Table("ShopCourseStudents") 
     .KeyColumns.Add("ShopCourseId") 
     .KeyColumns.Add("StudentId") 
     .Cascade.All(); 
    }) 

的問題是,當我嘗試加載的ShopCourse個名單,我得到了流利的錯誤:

Foreign key (ABC123AF9:Student [ShopCourseId, StudentId]) must have same number of columns as the referenced primary key (ShopCourses [Id])

不要覆蓋Fluent的Student映射,因爲它很簡單。就本示例而言,Student不需要知道它屬於哪個或其他任何可能擁有該特定Student記錄的課程。

這似乎是我正在做一些基本的,錯的 - 它是什麼,到底是什麼?提前很多!

回答

0

所以,問題在於我重複使用我的項目的自定義代碼,顯然,編寫的用於處理ManyToMany約定的部分大多已被破壞。我在這裏尋找的是ManyToMany關係,而不是HasMany。我遇到的問題是我的代碼強制對父對象的子對象(在本例中爲Student)進行引用,我不需要它,只會使事情變得複雜。刪除,然後我ManyToMany然後工作:

.Override<ShopCourse>(map => { 
    map.HasManyToMany(x => x.Students) 
     .Table("ShopCourseStudents") 
     .ParentKeyColumn("ShopCourseId") 
     .ChildKeyColumn("StudentId") 
     .Cascade.All() 
相關問題