2012-02-17 223 views
-1

我正在尋找一個很好的示例項目使用存儲庫模式和存儲過程。我花了很多次,我找不到任何使用sp來與存儲庫模式和數據庫通信的好例子。即使是一個普通的CRUD,我仍然會使用SP。存儲庫模式和存儲過程

另外,有沒有人有一個例子來執行存儲過程中的複雜數據在EF中的代碼?
例如,存儲過程返回多個數據表? 感謝

+0

在谷歌機器上有很多示例演示存儲庫模式。另外,你還在問第二個問題,這個問題並不十分清楚。你是什​​麼意思*在存儲過程中執行復雜的數據到代碼EF * – IAbstract 2012-02-17 18:09:04

+0

我找不到任何使用sp與存儲庫模式進行通信的好例子。即使是一個普通的CRUD,我仍然會使用SP。 – 2012-02-17 18:48:14

回答

3

我無法找到使用SP與 庫模式commmunicate任何很好的例子。即使是一個普通的CRUD,我仍然會使用SP。

只要想一下pattern和您的選擇 - 您只能使用SP並且希望負責數據訪問的對象。你不需要任何示例項目 - 你只需要思考。

當執行存儲過程,你會通過接口等被定義簡單的DAO(數據訪問對象)結束倉庫:

public interface IEntityDao 
{ 
    IEnumerable<Entity> GetAll(); 
    Entity GetByKey(int key); 
    bool Insert(Entity data); 
    bool Update(Entity data); 
    bool Delete(int key); 
} 

這是CRUD操作基本界面上Entity堅持類。每個方法實現都會調用單個存儲過程來執行操作。如果您需要任何其他操作(例如某些過濾或排序),您將創建新的存儲過程並公開調用此存儲過程的新操作。

如果這是或不是存儲庫,可以討論,但只是SP不會爲您提供更多。例如,這部分定義幾乎不可能在通用級別上實現:

客戶端對象以聲明方式構造查詢規範,並將它們提交到Repository以滿足要求。

您的「查詢規範」將始終只有特定於給定存儲過程的參數並傳遞給您的公開操作。您將無法聲明性地定義整個查詢(除非您將SQL作爲參數傳遞給SP)。

您可以直接通過ADO.NET調用存儲過程,也可以在EF中使用函數import或ExecuteStoreQuery/ExecuteStoreCommand。 EF能夠執行具有此限制的複雜存儲過程:

  • 存儲過程僅返回單個結果集。對於多個結果集,您將需要EFExtensions,或者您將不得不等待.NET 4.5將此功能包含在內
  • 存儲過程不得返回不同的結果集 - 這意味着結果集的結構必須與每個結果集相同SP執行(沒有支點或動態SQL返回不同數量的列)

函數導入具有更少的次要限制。如果遵循這些規則,您將能夠爲SP返回的每個結果集創建類/複雜類型。

+0

好吧,這意味着我不應該根據您的建議使用來自Repository。不是嗎? 我很困惑以及如何使用EF來進行實體映射。這就是爲什麼我真的想要一個例子。 – 2012-02-17 23:48:48

+0

我沒有這麼說。如果你需要使用SP,你將永遠以這樣的結果結束。 – 2012-02-17 23:53:21

+0

我編輯了我以前的答案。 因爲您描述的方式只是ADO.Net,這是我目前使用CRUD進行的項目設計。 – 2012-02-17 23:55:32