2011-10-19 73 views
1

奧姆斯往往映射一個一對多的關係,如:庫模式,奧姆斯和getter和setter

class Parent { 
    IList<Child> Children { get; set; } 
} 

的問題是,在倉庫中,你可能有:

GetChildrenOfParent(int parentID) { 
    from c in Children... 

    return children; 
} 

你現在有兩個地方可以「得到」孩子。當你想添加的東西,比如也許只有回到孩子誰沒有刪除標誌,你可能有:

GetChildrenOfParent(int parentID) { 
    from c in Children.. 
    where not deleted 

    return children; 
} 

class Parent { 
    IList<Child> Children { get .... only get not deleted children; set; } 
} 

你明白我的意思嗎?您現在有兩個地方可以選擇執行吸氣器程序。看來,有該程序的合理位置是在倉庫中,但是這意味着:

foreach (var child in parent.Children) 

不通過你的「吸」去了,因此具有一個一對多的ORM的整體思路這種方式映射似乎是錯誤的?

回答

0

我不太確定你的問題是什麼,但我真的不知道它在哪裏是錯誤的。這歸結於設計選擇IMO。你想訪問每個實體的層次數據(子實體)嗎?如果你願意並且想要在初始獲取時加載這些數據,那麼使用一對多就是一個節省時間的選擇(你可以選擇預加載或者延遲加載)。在這種情況下,在第一個示例中提取數據可能對您有好處。您可以使用LINQ到的數據進行過濾,只帶回「不刪除」的結果或「任何你需要的過濾器」,像這樣:

IList<Child> list = parent.Children.Where(x => x.Deleted == false); 

就個人而言,我喜歡保持乾淨,當我使用存儲庫模式(我最近成爲ActiveRecord模式的忠實粉絲)。我更喜歡把它分成它自己的方法調用。您可以將存儲庫調用添加到屬性名稱children中,但對於我來說,這感覺就像我跨越界限之間有一個模型,並在那裏模糊了該模型。

但是這樣做有時會導致你用一大堆方法來做基本的過濾或者一堆愚蠢的一堆或者超載來管理你想要選擇'Deleted Or Not'和'Male Or Female'的案例或者只是'刪除或不'。

正如我所說,這歸結於選擇。如果你認爲自己最終會在存儲庫中出現一個愚蠢的重載列表,那麼你希望自己的應用如何發展壯大,以便將來的編碼人員能夠理解你的代碼,管理的代碼更少,而且不會干擾性能(或使其性能更理想)。在這種情況下進行測試可以幫助您重構而不會破壞代碼。

不要掛上「正確」或「錯誤」的做事方式。

+0

如果你做了list = parent.children.where ...你在你的例子中使用過,想象一下當你在這個地方有數百個這樣的調用會發生什麼,現在你想改變它到x.deleted && x.age <18。getter或repository方法的意義在於,您只能在一個地方更改它,並且不會破壞任何合同。 – BobTurbo

+0

準確地說,這就是爲什麼我說我寧願保持清潔並將其放入自己的存儲庫方法。如果你知道我確實不確定你在問什麼,但是我回到我原來的建議,那麼選擇適合你和你的應用的東西,不要因爲你對'最佳實踐'的解釋而陷入困境你是'正確'或'錯誤'。從個人經驗來看,試圖嚴格遵守某些認爲「正確」或「錯誤」的結果會導致主要方式放慢進度,或者導致代碼過載。 – lloydphillips

+0

如果您需要在多個地方使用過濾的查詢,那麼爲其創建特定方法以幫助代碼維護絕對有意義。無論您是否將這些結果作爲課堂上的財產訪問,都歸結爲個人選擇您想要如何建模域的方式。 – lloydphillips