2011-10-31 83 views
5

我的場景 我正在使用Visual Studio 2010與實體框架4.1 我有一個包含許多表和許多存儲過程的遺留數據庫。我正在寫一個ASP.NET C#程序使用MVC 3在實體框架中映射選擇存儲過程

我已經採用了'數據庫第一'設計使用ADO.NET DbContext,所以我有一個edmx與所有的模型和關聯和導航屬性很好地設置。 我可以將插入,更新,刪除過程映射到相關模型。 我用'功能導入'來導入其他存儲過程。 但是,我無法找到一種方法來映射我的選擇過程以選擇操作(按ID選擇,選擇列表,按過濾器等選擇)。

EF似乎使用延遲加載,所以我想要發生的是當對象獲取其子對象時它使用已經寫入的存儲過程。 (選定的程序需要考慮的一個「請將isDeleted」標誌,並使用了「ORDER BY子句,除其他外)

我從這篇文章中看到 http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx 是LINQ到SQL允許拖動和SP的下降,這聽起來,或多或少,正是我想要的。

我也遇到過DefiningQuery這個詞。 http://msdn.microsoft.com/en-us/library/cc982038.aspx 這是我想要的嗎?我不喜歡註釋'當您運行「更新模型嚮導」時,對存儲模型所做的任何更改(包括定義查詢)都將被覆蓋。

總之,我想要發生的事情是,當一個對象獲取其使用我的存儲過程的子對象時。

使用實體框架可以實現我的目標嗎? 我錯過了一些明顯的東西嗎?

或者我應該儘量做到真正聰明和修改數據庫實體T4模板,這樣,例如,我的生成地址模式有此屬性:

public virtual ICollection<AddressLine> AddressLines { 
    get{ 
     DBWrapper _db = new DBWrapper(); 
     return _db.GetAddressLines(AddressID); 
    } 
    set{}; 
} 

其中GetAddressLines是調用一個函數的自定義功能導入並進行必要的轉換。

回答

6

這是不可能的。您可以導入存儲過程作爲函數導入並手動執行它們,但不能用自定義存儲過程替換由EF生成的查詢。

+0

謝謝。這證實了我的懷疑 – Webbie4

2

除了你可以,排序。

把你最基本的選擇存儲過程(即最接近「select * from mytable」的那個,並用它來定義你的數據庫中的一個視圖)讓實體框架使用這個「myview」而不是「mytable 「然後映射你插入,更新和刪除這個基於視圖的實體的存儲過程,就像你原來爲你的表一樣做的那樣

最後,使用函數導入來進行更多選擇性選擇,並定義它們以返回實體的集合。因此,如果你有像Person實體這樣的東西,並且你有一個叫做FetchPersonByAge(int)的存儲過程,你的實體最終會有一個叫做「GetByAge(int)」的靜態方法,然後你可以調用它代碼如下:var people33 = Person。getByAge(33);

我已經這樣做了,而且做得很不錯,讓我尊重的傳統數據庫的設計要求所有數據庫的訪問是通過其存儲的特效,也沒有用戶代碼直接訪問表。見朱莉·勒曼的文章:

http://msdn.microsoft.com/en-us/data/gg699321.aspx

戴夫