Entity Framework 4-第三篇-使用Entity Framework调用存储过程

摘要
本文将向你介绍如何调用存储过程对SQL Server数据库中的数据进行CRUD操作。文中采用的数据库依然是我们在本系列第一篇文章《采用Model-First 开发方式创建数据库》中创建的,使用的Web页面是在第二篇文章《使用Entity Framework 进行CRUD操作》中创建的 ,可以点击[代码]下载链下载项目文件,要用VS2010打开。


步骤1.创建存储过程
首先需要创建存储过程,第一个存储过程的功能是查表UserAccount记录的,代码如下:

view plaincopy to clipboardprint?
01.CREATE PROCEDURE dbo.UserAccounts_SelectAll  
02.AS
03.      SET NOCOUNT ON
04.
05.      SELECT Id, FirstName, LastName, AuditFields_InsertDate,  
06.             AuditFields_UpdateDate  
07.        FROM UserAccounts  
08.
09.      RETURN
CREATE PROCEDURE dbo.UserAccounts_SelectAll
AS
      SET NOCOUNT ON

      SELECT Id, FirstName, LastName, AuditFields_InsertDate,
             AuditFields_UpdateDate
        FROM UserAccounts

      RETURN下面一个存储过程功能是通过Id选择UserAccount表中一条记录,代码如下:

view plaincopy to clipboardprint?
01.CREATE PROCEDURE dbo.UserAccounts_SelectById  
02.(  
03.      @Id int
04.)  
05.AS
06.      SET NOCOUNT ON   
07.
08.      SELECT Id, FirstName, LastName, AuditFields_InsertDate,  
09.             AuditFields_UpdateDate  
10.        FROM UserAccounts  
11.       WHERE Id = @Id  
12.
13.      RETURN
CREATE PROCEDURE dbo.UserAccounts_SelectById
(
      @Id int
)
AS
      SET NOCOUNT ON

      SELECT Id, FirstName, LastName, AuditFields_InsertDate,
             AuditFields_UpdateDate
        FROM UserAccounts
       WHERE Id = @Id

      RETURN第三个存储过程的功能是向UserAccounts表中插入一条记录,代码如下:

view plaincopy to clipboardprint?
01.CREATE PROCEDURE dbo.UserAccounts_Insert  
02.(  
03.      @FirstName nvarchar(50),  
04.      @LastName nvarchar(50),  
05.      @AuditFields_InsertDate datetime,  
06.      @AuditFields_UpdateDate datetime  
07.)  
08.AS
09.      INSERT INTO UserAccounts (FirstName, LastName, AuditFields_InsertDate,  
10.                                AuditFields_UpdateDate)  
11.      VALUES (@FirstName, @LastName, @AuditFields_InsertDate,  
12.              @AuditFields_UpdateDate)  
13.
14.      SELECT SCOPE_IDENTITY() AS Id
CREATE PROCEDURE dbo.UserAccounts_Insert
(
      @FirstName nvarchar(50),
      @LastName nvarchar(50),
      @AuditFields_InsertDate datetime,
      @AuditFields_UpdateDate datetime
)
AS
      INSERT INTO UserAccounts (FirstName, LastName, AuditFields_InsertDate,
                                AuditFields_UpdateDate)
      VALUES (@FirstName, @LastName, @AuditFields_InsertDate,
              @AuditFields_UpdateDate)

      SELECT SCOPE_IDENTITY() AS Id第四个存储过程的功能是更新UserAccount表中的数据,代码如下:

view plaincopy to clipboardprint?
01.CREATE PROCEDURE dbo.UserAccounts_Update  
02.(  
03.      @Id int,  
04.      @FirstName nvarchar(50),  
05.      @LastName nvarchar(50),  
06.      @AuditFields_UpdateDate datetime  
07.)  
08.AS
09.      SET NOCOUNT ON
10.
11.      UPDATE UserAccounts  
12.         SET FirstName = @FirstName,  
13.             LastName = @LastName,  
14.             AuditFields_UpdateDate = @AuditFields_UpdateDate  
15.       WHERE Id = @Id  
16.
17.      RETURN
CREATE PROCEDURE dbo.UserAccounts_Update
(
      @Id int,
      @FirstName nvarchar(50),
      @LastName nvarchar(50),
      @AuditFields_UpdateDate datetime
)
AS
      SET NOCOUNT ON

      UPDATE UserAccounts
         SET FirstName = @FirstName,
             LastName = @LastName,
             AuditFields_UpdateDate = @AuditFields_UpdateDate
       WHERE Id = @Id

      RETURN最后一个存储过程的功能是删除UserAccount表中的记录,代码如下:

view plaincopy to clipboardprint?
01.CREATE PROCEDURE dbo.UserAccounts_Delete  
02.(  
03.      @Id int
04.)  
05.AS
06.      SET NOCOUNT ON
07.
08.      DELETE
09.        FROM UserAccounts  
10.       WHERE Id = @Id  
11.
12.      RETURN
CREATE PROCEDURE dbo.UserAccounts_Delete
(
      @Id int
)
AS
      SET NOCOUNT ON

      DELETE
        FROM UserAccounts
       WHERE Id = @Id

      RETURN在我们进行下一步之前,你必须在OrderSystem数据库中创建上面的那些存储过程。

步骤2:将存储过程添加到实体中
打开项目中的OrderDB.edmx文件。打开后,会出现设计器,同时模型浏览器里可以看到数据库的实体,复杂属性和关系。在OrderDB.edmx右键选择Update Mode From DataBase,这时会出现更新向导,可以看到前面的创建的5个存储过程显示出来。


展开Stored Procedures节点,选择所有存储过程,然后点击完成。这时模型浏览器中会多出5个存储过程对象。


右击模型浏览器中的UserAccounts_SelectAll存储过程选择Add Function Import,这时就可以给OrdersDBContainer类添加一个执行UserAccounts_SelectAll存储过程的方法了。


选择存储过程执行后的返回值类型,当我们要返回一个UserAccount列表,而Framework没有提供这种类型,这时采用这个方法创建会很方便。我们可以先创建一个复杂类型用来表示存储过程返回值的类型。由于SelectAll 和 SelectById 两个存储过程返回的字段相同,只需创建一种复杂类型。

点击Get Column Information按钮,VS将会检测存储过程返回的字段。当返回字段检测完后,点击下面的Create New Complex Type 按钮,这时会自动选择Complex 选项,复杂类型的名字也会添加到右边下列框中。默认的复杂类型的名字为存储过程的名字加上“Result”。由于我将会在多个存储过程返回值中使用该复杂类型,建议取一个比较通用的名字,这里将名字改为“UserAccounts_Select_Result”,点击OK。


这时你会看到在模型浏览器的Function Imports 文件夹中多了一个UserAccounts_SelectAll方法,同时在复杂类型节点下面多了一个UserAccounts_Select_Result类型。


右击模型浏览器中的UserAccounts_SelectById 存储过程选择Add Function Import,然后选择UserAccounts_Select_Result 类型作为该存储过程的返回值类型,点击OK。

下面是在UserAccount中使用插入,更新和删除的存储过程,右击设计器中的UserAccount实体选择Stored Procedure Mapping,会出现详细映射窗口。

点击第一行的替换为UserAccounts_Update存储过程。其他的属性自动映射完成,只有AuditFields_UpdateDate需要自动映射为AuditFields.UpdateDate属性。


最后是映射Delete存储过程,将