2

我剛剛開始使用實體框架4.0和ASP.NET MVC 2,並且有幾個關於使用存儲過程和分頁的問題。實體框架4 - 調用選擇/分頁存儲過程

您可以將插入,更新和刪除操作映射到存儲過程,並且我已經完成了此操作。然而,對於我的分頁工作,我需要映射選擇操作。

現在是我可以做到這一點的唯一/最好的方式,通過我的模型瀏覽器,右鍵單擊存儲過程和「添加函數導入」並添加它。

這導致下面的代碼....

var contactFormSubmissions = _entities.ContactFormSubmission_GetContactFormSubmissions(1, 10); 

我這個問題是,它增加了全球實體容器在根級別,而不是像插入/更新ContactFormSubmission實體和刪除動作。

我寧願這樣的事情,但通過通過存儲過程...

_entities.ContactFormSubmissions.Select<ContactFormSubmission>(string.Empty, pageParam, pageSizeParam); 

這樣的選擇被稱爲以同樣的方式與其他的行動,我不有很多的功能,在結束實體容器的根可能會變得不可管理。

這是一個較小的問題,至少目前它的所有工作。

我的下一個問題是如何最好地實現使用此功能的分頁。

我已經看到關於如何使用MVC和Entity Framework完成分頁的所有示例都使用了LINQ和IQueryable。有沒有辦法使用IQueryable與延遲加載和LINQ函數Skip/Take與基於表的函數/ sproc?

http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/

PS - 使用SP的將是巨大的MVC實體框架的分頁任何的例子!

回答

1

開箱即用的LINQ不會包裝存儲過程。實體框架函數是通過EF調用存儲過程並返回實體的唯一方法。這是可以理解的,因爲EF已經知道知道什麼參數來映射您的分頁變量。你會/不應該這樣做,但是我覺得強迫(因爲沒有什麼是不可能的)說你可以爲你的程序編寫一個自定義的LINQ實現,但這將是一個工作的高峯來乾淨地包裝幾個程序。

幾點建議:

  • 你可以只使用LINQ和跳過存儲過程
  • 如果你留在EF通過函數封裝存儲過程,您可以通過破壞減輕許多功能問題的模型分成若干上下文
  • 可以使用EF上下文的連接屬性直接調用存儲過程,並使用只讀(非EF附加的)viewmodel類來進行顯示。id(或其他主鍵)字段仍然是正確的值,可讓您進入詳細屏幕或json回調以獲得真實EF對象的可編輯版本

這些都不是完美的,但很多處理這個問題的方法。