日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]Entity Framework4.0 (七) EF4的存储过程

發布時間:2025/7/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]Entity Framework4.0 (七) EF4的存储过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉自:http://www.cnblogs.com/marksun/archive/2011/12/21/2296500.html

前面了解了EF4的CRUD的操作,你會發現EF4使用起來比較簡單的。呵呵,之前我們使用數據庫的時候,有時會使用存儲過程代替在代碼中直接使用SQL語句。

使用存儲過程的好處:

  • 提高效率:因為存儲過程是經過編譯優化后,存儲在數據庫服務器的。SQL語句在執行的時候,需要臨時編譯。一般來說,存儲過程的效率比SQL語句效率高。
  • 降低日后維護的難度:因為對存儲過程的修改不需要修改應用程序代碼。我們在程序代碼中直接調用的是存儲過程名字,和參數列表(如果是帶參數的存儲過程),在維護的時候,可以不修改存儲過程的名字和參數列表,而是修改存儲過程的具體實現細節,從而達到維護的目的。

我們首先來創建幾個Category存儲過程:

1. 打開SQL server2008 Management Studio,我們使用Northwind 數據庫。

依次展開節點,如下圖:

此時打開新建存儲過程的窗口如下圖:

上面圖中已經標出有三部分:1.存儲過程名字。 2. 存儲過程參數。3.存儲過程體。只要補充這三部分,然后執行腳本,就創建了該存儲過程。

我們先添加一個插入Category的存儲過程,代碼如下:

1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 -- ============================================= 6 -- Author: <Author,,Name> 7 -- Create date: <Create Date,,> 8 -- Description: <Description,,> 9 -- ============================================= 10 CREATE PROCEDURE InsertCategory 11 -- Add the parameters for the stored procedure here 12 @cateName varchar(15), 13 @cateDesc ntext 14 AS 15 BEGIN 16 -- SET NOCOUNT ON added to prevent extra result sets from 17 -- interfering with SELECT statements. 18 SET NOCOUNT ON; 19 20 -- Insert statements for procedure here 21 insert into dbo.Categories (CategoryName,Description)values(@cateName,@cateDesc) 22 END 23 GO

(小技巧:在你寫表名和列名的名字的時候,名字太長,不方便的話。你可以直接使用鼠標左鍵拖拽表名或列名到右邊的編輯窗口,然后松開鼠標即可。)

好了,InertCategory這個存儲過程的創建腳本已經寫完,然后,我們執行下該存儲過程的。如果在下面的提示框中有:Command(s) completed successfully.,則表示創建成功,然后“刷新左邊,就會發現已經創建的存儲過程已經出現了”如下圖:

在新建的存儲過程上右鍵,可以修改、或執行該存儲過程。我們選擇執行。如下圖

點擊“OK”,成功以后,查看數據庫,新記錄已經插入成功。

同樣的方式,我們創建刪除Category的存儲過程:DeleteCategory,代碼如下:

1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 -- ============================================= 6 -- Author: <Author,,Name> 7 -- Create date: <Create Date,,> 8 -- Description: <Description,,> 9 -- ============================================= 10 CREATE PROCEDURE DeleteCategory 11 -- Add the parameters for the stored procedure here 12 @cateID int 13 AS 14 BEGIN 15 -- SET NOCOUNT ON added to prevent extra result sets from 16 -- interfering with SELECT statements. 17 SET NOCOUNT ON; 18 19 -- Insert statements for procedure here 20 delete from dbo.Categories where CategoryID =@cateID 21 END 22 GO

我們創建更新Category的存儲過程:DeleteCategory,代碼如下:

1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 -- ============================================= 6 -- Author: <Author,,Name> 7 -- Create date: <Create Date,,> 8 -- Description: <Description,,> 9 -- ============================================= 10 CREATE PROCEDURE UpdateCategory 11 -- Add the parameters for the stored procedure here 12 @cateID int, 13 @cateName nvarchar(15), 14 @cateDesc ntext 15 AS 16 BEGIN 17 -- SET NOCOUNT ON added to prevent extra result sets from 18 -- interfering with SELECT statements. 19 SET NOCOUNT ON; 20 21 -- Insert statements for procedure here 22 update dbo.Categories set CategoryName =@cateName, Description=@cateDesc 23 where CategoryID=@cateID 24 END 25 GO

我們創建選擇Category的存儲過程:DeleteCategory,代碼如下:

1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 -- ============================================= 6 -- Author: <Author,,Name> 7 -- Create date: <Create Date,,> 8 -- Description: <Description,,> 9 -- ============================================= 10 CREATE PROCEDURE SelectCategory 11 -- Add the parameters for the stored procedure here 12 13 AS 14 BEGIN 15 -- SET NOCOUNT ON added to prevent extra result sets from 16 -- interfering with SELECT statements. 17 SET NOCOUNT ON; 18 19 -- Insert statements for procedure here 20 SELECT * from dbo.Categories 21 END 22 GO

好了,我們就創建這些存儲過程。 2.我們創建一個項目,來通過EF4使用這些存儲過程。

打開visual studio2010,創建windows form應用程序:EFStoredProcedureDemo.

在項目:EFStoredProcedureDemo上面右鍵--》添加新項,選擇:Ado.net Entity Data Model,名稱:Northwind,

然后點下一步:此時點擊“New Connection” 找數據庫服務器,再找到Northwind數據庫。如下圖:

點擊下一步:

在tables里選擇Category,如下圖:

在Stored Procedure里面選擇剛才創建的四個存儲過程。

選中“Pluralize or singularize generated object names”和“Include foreign key columns in the model”, 點擊finish.生成*.edmx,并自動打開設計視圖:

在設計器選中實體Category,點擊右鍵:選擇Table Mapping .在Mapping 窗口中有兩項:Mapping entity to tables和Mapping entity to Functions。選擇Mapping entity to Functions,如下圖:

存儲過程的參數也要對應起來:最終結果如下圖:

?好的,現在我們就把更新、刪除、插入的存儲過程與EDM的函數對應起來了。還有一個比較特殊的是就是選擇的存儲過程。

下面我們來映射SelectCategory存儲過程。

在EDM設計器的空白處:右鍵--》Model Browser,打開Model 瀏覽窗口。如下圖:

在SelectCategory上面右鍵->Add Function Import...如下圖:

Function Import Name是引入后,在代碼中使用時所用到的名字。然后返回值的集合,選擇:實體(Category),如下圖:然后點擊OK

此時我們在Model Browser 中看到我們已經成功引用一個函數:如下圖:

3. 下面我們來使用這個作了存儲過程映射的EDM,在Form1上添加控件如下圖:(因為在寫代碼的時候,都是通過訪問其Name屬性來找到該控件的。所以,我把文本框控件的顯示文本初始化為其Name,這樣既方便了自己編程,也方便了大家閱讀代碼。)

FillListbox 用于填充數據到listbox,click事件代碼如下:

1 private void button1_Click(object sender, EventArgs e) 2 { 3 using(var context = new NorthwindEntities()) 4 { 5 //var categories = from c in context.Categories 6 // select new {c.CategoryID,c.CategoryName}; 7 8 var categories = context.SelectCategory(); 9 10 this.listBox1.DisplayMember = "CategoryName"; 11 this.listBox1.ValueMember = "CategoryID"; 12 this.listBox1.DataSource = categories; 13 } 14 }

注意:上面注釋掉的部分,是我們以前使用的方式。現在的context調用了一個方法:SelectCategory()。它就是剛才我們用selectCategory存儲過程映射成的那個函數。SelectCategory()在調用的時候,最終是執行低層的selectCategory存儲過程的。

添加功能。代碼如下:

1 private void btnInsert_Click(object sender, EventArgs e) 2 { 3 using (var context = new NorthwindEntities()) 4 { 5 Category c = new Category(); 6 c.CategoryName = this.tbCateNameNew.Text.ToString().Trim(); 7 c.Description = this.tbCateDescNew.Text.ToString().Trim(); 8 9 context.AddToCategories(c); 10 context.SaveChanges(); 11 MessageBox.Show("succeed"); 12 } 13 }

更新功能,代碼如下:

1 private void btnUpdate_Click(object sender, EventArgs e) 2 { 3 int id =Convert.ToInt32(this.tbCateIDUpdate.Text); 4 5 using (var context = new NorthwindEntities()) 6 { 7 var categories = context.Categories.First(c=>c.CategoryID == id); 8 9 categories.CategoryName = this.tbNameUpdate.Text.ToString().Trim(); 10 categories.Description = this.tbDescUpdate.Text.ToString().Trim(); 11 context.SaveChanges(); 12 MessageBox.Show("succeed"); 13 } 14 }

刪除功能,代碼如下:

1 private void btnDele_Click(object sender, EventArgs e) 2 { 3 int id = Convert.ToInt32(this.tbCateID.Text); 4 5 using (var context = new NorthwindEntities()) 6 { 7 var categorie = context.Categories.First(c => c.CategoryID == id); 8 context.DeleteObject(categorie); 9 10 context.SaveChanges(); 11 MessageBox.Show("succeed"); 12 } 13 }

從上面可以看到,使用了存儲過程以后,我們作增刪改的代碼,并沒有任何變化。只有選擇有些變化。以前我們沒有映射存儲過程,所以LINQ語句最終是生成SQL腳本現在我們使用了存儲過程以后,再執行上面這些代碼時,最終都是映射成調用數據庫的存儲過程,而不再生成腳本了。如果有Data profile viewer的話,你可以監控觀察數據庫的執行情況,可惜我機器上沒有,所以無法截圖了。

存儲過程在EF4中是當作函數來處理的。

可以打開EDM的xml的形式查看:和沒有映射存儲過程以前,發現有以下變化。

SSDL部分:

1 <Function Name="DeleteCategory" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo"> 2 <Parameter Name="cateID" Type="int" Mode="In" /> 3 </Function> 4 <Function Name="InsertCategory" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo"> 5 <Parameter Name="cateName" Type="varchar" Mode="In" /> 6 <Parameter Name="cateDesc" Type="ntext" Mode="In" /> 7 </Function> 8 <Function Name="SelectCategory" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" /> 9 <Function Name="UpdateCategory" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo"> 10 <Parameter Name="cateID" Type="int" Mode="In" /> 11 <Parameter Name="cateName" Type="nvarchar" Mode="In" /> 12 <Parameter Name="cateDesc" Type="ntext" Mode="In" /> 13 </Function>

CSDL部分:

1 <FunctionImport Name="SelectCategory" EntitySet="Categories" ReturnType="Collection(NorthwindModel.Category)" />

Mapping部分分兩部分映射:

1 <ModificationFunctionMapping> 2 <InsertFunction FunctionName="NorthwindModel.Store.InsertCategory" > 3 <ScalarProperty Name="Description" ParameterName="cateDesc" /> 4 <ScalarProperty Name="CategoryName" ParameterName="cateName" /> 5 </InsertFunction> 6 <UpdateFunction FunctionName="NorthwindModel.Store.UpdateCategory" > 7 <ScalarProperty Name="Description" ParameterName="cateDesc" Version="Current" /> 8 <ScalarProperty Name="CategoryName" ParameterName="cateName" Version="Current" /> 9 <ScalarProperty Name="CategoryID" ParameterName="cateID" Version="Current" /> 10 </UpdateFunction> 11 <DeleteFunction FunctionName="NorthwindModel.Store.DeleteCategory" > 12 <ScalarProperty Name="CategoryID" ParameterName="cateID" /> 13 </DeleteFunction> 14 </ModificationFunctionMapping>

?

1 <FunctionImportMapping FunctionImportName="SelectCategory" FunctionName="NorthwindModel.Store.SelectCategory" />

在概念層EF4并不直接和存儲過程打交到。而是以函數的形式處理實體。這樣更符合面向對象的編程形式。

存儲過程結合EF4的使用,是很方面的。可以有人專門設計存儲過程,而由其它人使用的時候,只是使用映射過后的函數。這樣就更加直觀。調用時也不必考慮底層存儲過程的形式了。

總結

以上是生活随笔為你收集整理的[转]Entity Framework4.0 (七) EF4的存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。