2013-01-09 38 views
1

我有一個與NHibernate一起使用的域模型的場景,它看起來像下面那樣。如何實現nhibernate中的導航屬性

public class BaseClass 
{ 
    public virtual int Id { get; set; } 
    public virtual string SomeProperty { get; set; } 
} 

public class FirstClass : BaseClass 
{ 
    public virtual IList<AnotherClass> AnotherClassList { get; set; } 
} 

public class SecondClass : BaseClass 
{ 
    public virtual AnotherClass AnotherClass { get; set; } 
} 

public class AnotherClass 
{ 
    public virtual int Id { get; set; } 
    public virtual BaseClass MyNavigationalProperty { get; set; } 
} 

它看起來不錯,但它不工作,因爲我期待它會這樣做。這是我的場景;

由於我的第一步我保存我的FirstClass與列表中的一個或多個AnotherClass,它的工作完美。我可以用列表中的相關AnotherClasses檢索我的FirstClass。

在我的第二步我分別保存一個新的AnotherClass並將MyNavigationalProperty從我的第一步設置爲我的FirstClass。它看起來不錯,但...

在我的最後一步我檢索我的FirstClass,我期待我的AnotherClassList包含我的第二步中的AnotherClass。但是我從第一步纔拿到原來的AnotherClasses。

展望數據庫中,我可以看到記錄從我的第二個步驟,但也有在表AnotherClass,BaseClass_Id和FirstClass_Id兩個獨立的FKS,並FirstClass_Id爲NULL,所以我沒有得到我的最後一步,這個紀錄。

這是錯誤的方式來實現導航屬性?而且,如果是這樣,我該如何正確地做到這一點?或者...簡單地說,有沒有更好的方法來做到這一點?

編輯

從我得到了另一種思想Thilak的映射的問題,原來的域模型沒有利用裏繼承的,那就是我的實現。這是否有必要創建我自己的映射?這是否意味着我必須完全放棄自動映射?

+1

你能發佈你的實體映射嗎? –

+0

nhibernate的實現作爲框架的一部分被繼承,並且看着那個代碼,我注意到它使用自動映射功能來實現。所以我沒有任何映射可供分享。 – Per

+0

「我注意到它是使用自動映射功能實現的」<---使用FluentNhibernate? –

回答

1

該引用使用另一列作爲集合。你可以手動覆蓋它

class SetForeignKeyColumn : IAutomappingOverride<FirstClass> 
{ 
    public ... 
    { 
     instance.HasMany(x => x.AnotherClassList).KeyColumn("baseclass_id"); 
    } 
} 
+0

謝謝,這就是我一直在尋找 – Per