2017-05-06 129 views
3

我正在使用實體框架數據庫第一種方法將項目從Webforms轉換爲MVC應用程序,並使數據庫隨所有存儲過程一起就緒。實體框架數據庫第一種方法中的存儲過程

我成功創建了一個.edmx文件,並且能夠使用我的存儲過程,並且在有任何插入或更新操作執行時它運行良好。但是當我在其中一個存儲過程中使用select查詢時發生了真正的問題。

例如,存在具有以下列的Employee表:

EmpId, FirstName, LastName, Age, Salary 

我有一個存儲過程GetAllEmpDetails已以下選擇查詢。

Select 
    EmpId, (FirstName + ' ' + LastName) as FullName, Salary 
from 
    Employee 

現在,當我試圖與Employee類有5個屬性,每個表結構此存儲過程的結果進行綁定,然後我得到一個錯誤,對於Age屬性值預期,但它是在結果集中不可用。

我知道沒有FullName屬性,所以我的問題是如何解決這個問題與生成的模型類(在這種情況下Employee),以便它可以解決這些動態?

+0

請張貼一些代碼 –

+0

@JayakrishnanGounder:其實這個問題更多的是與實體框架 –

回答

5

如何映射EF存儲過程?

既然你是做數據庫第一種方法和你有一個EDMX文件,讓EF生成類爲您的存儲過程的結果。您可能有許多存儲過程,並且希望避免手動創建類:畢竟這是使用ORM工具的關鍵。還有一些存儲過程可能有參數。按照以下方式進行處理將爲您處理所有問題。 其實很簡單。

爲了得到EF爲你做這個,按照步驟如下:

  1. 雙擊您的EDMX文件
  2. 從數據庫中選擇更新模型

你會看到對話框類似如下:

enter image description here

  1. 確保您已勾選如圖所示的方框。

這將增加存儲過程,你會看到它在你的模型瀏覽器中,如下圖所示:

enter image description here

  • 如果你想更改類EF自動生成的名稱然後這樣做。我強烈建議你這樣做,併爲您的課程提供遵循.NET命名約定的有意義的名稱。我遵循的約定是從存儲過程名稱中刪除任何動詞並將結果附加到結尾。所以,你將最終名稱,如下圖所示:
  • enter image description here

  • 按OK

  • 一些注意

    這比手動編寫類要好得多,以防您的存儲過程名稱或參數存在編輯或結果返回更改。這種方法也適用於用戶定義的功能。

    一個疑難雜症

    會有時,存儲過程將不會出現在嚮導對話框選擇次數,這是因爲this。只需添加到您的存儲過程的開頭:

    SET FMTONLY OFF -- REMEMBER to remove it once the wizard is done. 
    
    +0

    非常感謝您的答覆。我遵循同樣的方法,但是我沒有創建一個新的複雜返回類型,而是選擇了實體(本例中爲_Employee_),然後在使用_Employee_類屬性映射select查詢時產生了問題。因此,如果我想使用EF生成的模型並使用存儲過程返回某些內容,那麼它應該是相等的,否則它會拋出錯誤。 由於我的項目有超過100個表,所以我將有額外的100個類來處理存儲過程。他們不能使用現有的模型嗎? –

    +0

    爲什麼你關心課程的數量?它們是由EF自動生成的? – CodingYoshi

    +0

    如果您的存儲過程返回的某些屬性與您的某個實體具有相同的屬性,則可以在上圖步驟5中選擇該實體。 – CodingYoshi

    0
    public class EmployeeProcedure 
    { 
        [Column("EmpId")] 
        public int EmployeeId { get; set; } 
    
        [NotMapped] 
        public string FullName { get; set; } 
    
        public double Salary { get; set; } 
    } 
    

    這一呼籲之後:

    this.Database.SqlQuery<EmployeeProcedure>("GetAllEmpDetails"); 
    
    +0

    的方法,而不是編碼問題你可能要添加'FullName'上的[NotMapped]'屬性_否則EF試圖從數據庫表中獲取該屬性(它不存在.....) –

    +0

    我只是將它寫在notepad ++上,它沒有被測試,它是如何解決它。 –

    相關問題