一千萬個為什麽

搜索

如何在Fluent NHibernate中映射一對一的關系。我已經嘗試了其他一切

我有這個表結構,並希望使用Fluent Hibernate(如果可能的子類)映射它。我無法更改結構,因為數據庫有太多記錄,可能導致主要應用程序返工。如果來自Party表的Id是個人和組織表中的外鍵會更容易,但在特定情況下,數據庫將人員和組織密鑰作為聚會表中的外鍵。任何幫助都會很棒。

派對表

ID PERSONID OrganizationId

人員表

ID FName參數 LName的

組織表

ID ORGNAME OrgDescription

最佳答案

如果鏈接表包含除組成復合ID的兩個ID之外的任何字段,則無法將鏈接表映射到自動化。在你的情況下,你的Party表有一個Id字段,它打破了自動化規則,因為它沒有很好的設計(即復合id不應該有一個自動遞增的id,盡管我們這樣做是為了索引我工作的地方)。

要解決這個問題,您只需要為Party創建一個ClassMap,並將Id映射為Id和引用Person和Organization。

然後,在您的Person和Organization實體中,您不是創建一個到Party的HasManyToMany映射,而是為Party實體創建一個HasMany。

實際上,您正在做的是顯式匹配代碼看起來更像是和ERD,而自動化意味著只有當它只包含復合主鍵時,才能通過鏈接表實現多對多關系。

這讓我難以忍受了三天,我把這條路線當作“黑客”,只是後來在幾周前在Fluent NHibernate的谷歌小組中讀到了這個解釋。

我希望有幫助,如果不是我可以為你拋出一些代碼。

另請參閱我的帖子同樣的情況

編輯:

Here is how this would look at a fairly high level. Remember, you'll have to initialize your collections in your entity constructors and create setter methods. See Getting Started

public class Party {
    public virtual int Id { get; set; }
    public virtual Person Person { get; set; }
    public virtual Organization Organization { get; set; }
}
public class PartyMap : ClassMap {
    public PartyMap() {
        Id(x => x.Id);
        References(x => x.Person);
        References(x => x.Organization);
    }
}
public class Person {
    public virtual int Id { get; set; }
    public virtual string FName { get; set; }
    public virtual string LName { get; set; }
    public virtual ICollection Parties { get; set; }
}
public class PersonMap : ClassMap {
    public PersonMap() {
        Id(x => x.Id);
        Map(x => x.FName);
        Map(x => x.LName);
        HasMany(x => x.Parties);
    }
}
public class Organization {
    public virtual int Id { get; set; }
    public virtual string OrgName { get; set; }
    public virtual string OrgDescription { get; set; }
    public virtual ICollection Parties { get; set; }
}
public class OrganizationMap : ClassMap {
    public OrganizationMap() {
        Id(x => x.Id);
        Map(x => x.OrgName);
        Map(x => x.OrgDescription);
        HasMany(x => x.Parties);
    }
}

轉載註明原文: 如何在Fluent NHibernate中映射一對一的關系。我已經嘗試了其他一切