3

我正在研究一個bug跟蹤應用程序。有門票,每張門票都有開門人用戶和分配的用戶。所以,基本上,我有兩個實體,它們之間有兩個多對一的關係。其原理是這樣的:FluentNHibernate:同一實體之間的多個一對多關係

用戶:

public class User 
{ 
    public virtual int Id { get; protected set; } 
    ... 

    public virtual IList<Ticket> OpenedTickets { get; set; } 
    public virtual IList<Ticket> AssignedTickets { get; set; } 
} 

票:

public class Ticket 
{ 
    public virtual int Id { get; protected set; } 
    ... 

    [Required] 
    public virtual User OpenerUser { get; set; } 
    public virtual User AssignedUser { get; set; } 
} 

我用FluentNHibernate的自動映射功能。

問題是,無論我設置的關係,在用戶的側面,兩個集合總是包含相同的數據。我想Fluent無法判斷哪個關係屬於哪個末端。

我搜索了一下,但沒有發現任何有用的東西。

編輯2:

我富爾德出與史蒂夫的幫助下,我要實現自己的IHasManyConvention。我還發現IHasManyConvention中生成的列名必須與我的IReferenceConvention生成的列名相匹配。隨着小調整,我得到它的工作。

我還驚訝地發現,調用方便的ForeignKey.EndsWith("Id")方法弄亂了整個事情。

雖然史蒂夫的回答本身並不能解決問題,但我非常感謝他指出我正確的方向。

+0

你試過檢查NHibernate在底層做了什麼嗎?我的意思是生成的數據庫模式如何以及在測試期間運行了哪些SQL查詢。 – Steves 2010-05-06 14:35:05

+0

是的,我做到了。它會產生完全無關的列。 – Venemo 2010-05-06 15:15:53

+0

好的,我終於設法解決了它。更新了我的帖子,並非常感謝您指引我朝着正確的方向發展。 – Venemo 2010-05-06 15:26:13

回答

2

自動映射爲其外鍵列生成相同的名稱。你可以通過自定義約定來解決這個問題,通過(映射的)屬性名稱來命名外鍵列:

class HasManyConvention : IHasManyConvention 
{ 
    public void Apply(IOneToManyCollectionInstance instance) 
    { 
     instance.Key.Column(instance.Member.Name); 
    } 
} 

// register convention using: 
autoMapping.Conventions.Add(new HasManyConvention()); 
相關問題