2010-10-07 55 views
2

如何將LINQtoSQL與存儲庫模式一起使用?LINQtoSQL,存儲庫模式和延遲加載

我是L2S的新手,發現它的延遲加載成爲使用repo模式的真正障礙。

通常情況下,我覺得像這樣的倉庫模式:

var myCustomer = null; 

using (var myRepo = new Repo()){ 
    myCustomer = myRepo.GetCustomerForCustomerId(123); 
} 

if(myCustomer.Orders.Any()){ 
//do something 
} 

麻煩的是,不會L2S嘗試以進行數據連接時myCustomer.Orders進行詢問?這不會導致不可預知的數據庫訪問問題嗎?

我的意思是,我可以告訴我的回購確認回購裏面的訂單,確信我們的完整測試覆蓋範圍驗證了開發者從未調用過我們沒有明確加載的實體,但我寧願只是擺脫延遲加載/對象數據上下文持久性。

所以,我有4個選項

  1. 創建用於獲取從L2S對象創建的域對象 - 大量的工作和修的的
  2. 創建我L2S對象的衍生verisons是打破他聯動(HTTP:// www.codeproject.com/KB/linq/linq-to-sql-detach.aspx)
  3. 改爲使用LLBLGenPro。
  4. 上訴到堆棧溢出的讀者

我有4個去,現在的智慧。

如何確保在回購關閉後我的對象不會調用數據庫?

是的,我確實讀過關於L2S和Repos的每個堆棧問題,他們都沒有回答這個問題。

+0

我不知道答案,但我的印象是,L2S或任何其他語言層往往比解決問題更令人害怕。有些人(包括我在內)因爲不知道幕後發生了什麼而感到煩惱。 – vulkanino 2010-10-07 14:06:44

+0

@vulkanino,只有沒有使用L2S的人可以這樣說。你更喜歡什麼,原始SQL? – 2010-10-07 14:13:58

+0

是的,數據庫的存儲過程中的原始sql確實如此。程序源碼中沒有sql代碼。 – vulkanino 2010-10-07 16:01:18

回答

1

有時它有用於急於加載實體的孩子。您可以使用DataLoadOptions.LoadWith這樣做來告訴您的DataContext在加載父實體時自動加載實體的子代。

片段從MSDN link above

Northwnd db = new Northwnd(@"c:\northwnd.mdf"); 
DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Customer>(c => c.Orders); 
db.LoadOptions = dlo 

您還可以使用DataLoadOptions.AssociateWith進一步自定義自動加載的行爲。