2013-05-14 57 views
2

考慮以下簡化域:預先加載一個可選一到一個與NHibernate

public class Movie 
{ 
    public virtual int Id { get; set; } 
    public virtual MovieDetail MovieDetail { get; set; } 
} 

public class MovieDetail 
{ 
    public virtual int Id { get; set; } 
    public virtual Movie Movie { get; set; } 
} 

一個MovieDetail不可能存在沒有Movie,但Movie可能沒有MovieDetail存在(即我們不知道細節它)。

我們的數據庫已經爲MovieId列一個單獨的表,和MovieDetail與列IdMovieId一個單獨的表。還有一個從MovieDetail.MovieIdMovie.Id的外鍵。我們已經將這一切都映射到了NHibernate中,但是當獲得Movie實例的集合時,我們需要一個包含MovieDetail的左外連接。如果不是這樣,那麼迭代Movie實例時可能會出現N + 1問題。現在就是這種情況:每次調用Movie.MovieDetail屬性都有一個單獨的查詢。

我試過one-to-one映射,但似乎是當你有兩個實例的情況下。在我們的案例中,我們並不總是有一個MovieDetail。此外,他們不共享相同的主鍵。

我研究過公式,但那需要我讓我的MovieDetail實現IUserType,基本上把NHibernate放到我的域中。我想避免這種情況。

回答

0

也許你可以嘗試在MovieMovieDetail的映射中添加多對一的關係,它將作爲一對一的映射。

當您將選項'not-null'設置爲「false」時,我認爲它也是可以爲空的。 我不知道你是否懶惰加載或沒有,當這是如此MovieDetail加載需要時,而不是左連接構造。

不是所有的屬性在兩個類中都是虛擬的嗎?

<many-to-one name="MovieDetail" column="Id" class="MovieDetail" not-null="false" lazy="false"/> 
+0

我無法讓它工作。可能的話,我們的領域有些異域風情(我簡化了它)。屬性應該是虛擬的(他們是)。 – Peter 2013-05-15 07:39:44

0

我是有點着急的,我不知道你是否能修改域/ DB模式,但你可能會想嘗試看看http://ayende.com/blog/3937/nhibernate-mapping-component

在我看來,Movie最多隻能有一個MovieDetail,它可能不在那裏。 MovieDetail可能有像Description,ReleaseDate,Actors等屬性我不明白你爲什麼分開這些概念。通過將它們放在一起,每次您想列出電影時,您都可以減少1張桌子和1張FK。

該組件允許您將數據隔離到單獨的實體中,同時映射到與Movie相同的表。

+0

那是一個簡化的域/模式。真實的事情有它的理由,但是我簡化了/將它簡化了。 – Peter 2013-08-21 12:20:43

相關問題