Entity framework第三篇.docx
- 文档编号:23462727
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:16
- 大小:542.54KB
Entity framework第三篇.docx
《Entity framework第三篇.docx》由会员分享,可在线阅读,更多相关《Entity framework第三篇.docx(16页珍藏版)》请在冰豆网上搜索。
Entityframework第三篇
ASP.NET4.0与EntityFramework4-第三篇-使用EntityFramework调用存储过程
LloydSheng写于2010年04月26日下午3:
34|有5人评论
摘要
本文将向你介绍如何调用存储过程对SQLServer数据库中的数据进行CRUD操作。
文中采用的数据库依然是我们在本系列第一篇文章《采用Model-First开发方式创建数据库》中创建的,使用的Web页面是在第二篇文章《使用EntityFramework进行CRUD操作》中创建的,可以点击[代码]下载链下载项目文件,要用VS2010打开。
步骤1.创建存储过程
首先需要创建存储过程,第一个存储过程的功能是查表UserAccount记录的,代码如下:
CREATEPROCEDUREdbo.UserAccounts_SelectAll
AS
SETNOCOUNTON
SELECTId,FirstName,LastName,AuditFields_InsertDate,
AuditFields_UpdateDate
FROMUserAccounts
RETURN
下面一个存储过程功能是通过Id选择UserAccount表中一条记录,代码如下:
CREATEPROCEDUREdbo.UserAccounts_SelectById
(
@Idint
)
AS
SETNOCOUNTON
SELECTId,FirstName,LastName,AuditFields_InsertDate,
AuditFields_UpdateDate
FROMUserAccounts
WHEREId=@Id
RETURN
第三个存储过程的功能是向UserAccounts表中插入一条记录,代码如下:
CREATEPROCEDUREdbo.UserAccounts_Insert
(
@FirstNamenvarchar(50),
@LastNamenvarchar(50),
@AuditFields_InsertDatedatetime,
@AuditFields_UpdateDatedatetime
)
AS
INSERTINTOUserAccounts(FirstName,LastName,AuditFields_InsertDate,
AuditFields_UpdateDate)
VALUES(@FirstName,@LastName,@AuditFields_InsertDate,
@AuditFields_UpdateDate)
SELECTSCOPE_IDENTITY()ASId
第四个存储过程的功能是更新UserAccount表中的数据,代码如下:
CREATEPROCEDUREdbo.UserAccounts_Update
(
@Idint,
@FirstNamenvarchar(50),
@LastNamenvarchar(50),
@AuditFields_UpdateDatedatetime
)
AS
SETNOCOUNTON
UPDATEUserAccounts
SETFirstName=@FirstName,
LastName=@LastName,
AuditFields_UpdateDate=@AuditFields_UpdateDate
WHEREId=@Id
RETURN
最后一个存储过程的功能是删除UserAccount表中的记录,代码如下:
CREATEPROCEDUREdbo.UserAccounts_Delete
(
@Idint
)
AS
SETNOCOUNTON
DELETE
FROMUserAccounts
WHEREId=@Id
RETURN
在我们进行下一步之前,你必须在OrderSystem数据库中创建上面的那些存储过程。
步骤2:
将存储过程添加到实体中
打开项目中的OrderDB.edmx文件。
打开后,会出现设计器,同时模型浏览器里可以看到数据库的实体,复杂属性和关系。
在OrderDB.edmx右键选择UpdateModeFromDataBase,这时会出现更新向导,可以看到前面的创建的5个存储过程显示出来。
展开StoredProcedures节点,选择所有存储过程,然后点击完成。
这时模型浏览器中会多出5个存储过程对象。
右击模型浏览器中的UserAccounts_SelectAll存储过程选择AddFunctionImport,这时就可以给OrdersDBContainer类添加一个执行UserAccounts_SelectAll存储过程的方法了。
选择存储过程执行后的返回值类型,当我们要返回一个UserAccount列表,而Framework没有提供这种类型,这时采用这个方法创建会很方便。
我们可以先创建一个复杂类型用来表示存储过程返回值的类型。
由于SelectAll和SelectById两个存储过程返回的字段相同,只需创建一种复杂类型。
点击GetColumnInformation按钮,VS将会检测存储过程返回的字段。
当返回字段检测完后,点击下面的CreateNewComplexType按钮,这时会自动选择Complex选项,复杂类型的名字也会添加到右边下列框中。
默认的复杂类型的名字为存储过程的名字加上“Result”。
由于我将会在多个存储过程返回值中使用该复杂类型,建议取一个比较通用的名字,这里将名字改为“UserAccounts_Select_Result”,点击OK。
这时你会看到在模型浏览器的FunctionImports文件夹中多了一个UserAccounts_SelectAll方法,同时在复杂类型节点下面多了一个UserAccounts_Select_Result类型。
右击模型浏览器中的UserAccounts_SelectById存储过程选择AddFunctionImport,然后选择UserAccounts_Select_Result类型作为该存储过程的返回值类型,点击OK。
下面是在UserAccount中使用插入,更新和删除的存储过程,右击设计器中的UserAccount实体选择StoredProcedureMapping,会出现详细映射窗口。
点击第一行的
我们必须进行实体属性到存储过程参数的映射。
由于存储过程会返回新创建记录的Id,必须选择该Id赋值到哪个属性。
在ResultColumnBindings节点下的
映射更新的存储过程,将
其他的属性自动映射完成,只有AuditFields_UpdateDate需要自动映射为AuditFields.UpdateDate属性。
最后是映射Delete存储过程,将
不要忘了保存上面的操作结果,OrdersDBContainer现在就能使用那些存储过程了,从而进行UserAccount记录的CRUD操作。
步骤3:
创建Web表单
下面将在程序中创建一个表单,用来管理UserAccount数据。
1.在项目文件上右键,选择Add->NewItem..
2.选择WebForm模板,将名字改为UsersSP.aspx,点“Add”。
3.在UserSP.aspx的div之间添加如下代码:
SelectAUser: | DropDownListrunat=serverID="ddlUsers"AutoPostBack="True"> DropDownList> |
FirstName: | TextBoxrunat="server"ID="txtFirstName"> TextBox> |
LastName: | TextBoxrunat="server"ID="txtLastName"> TextBox> |
Inserted: | Labelrunat="server"ID="lblInserted"> Label> |
Updated: | Labelrunat="server"ID="lblUpdated"> Label> |
Buttonrunat=serverID="btnSave"Text="Save"/> ButtonID="btnDelete"runat="server"Text="Delete"/> 这里采用的table的对form进行了简单的布局。 转到Design视图你会看到表单的样子如下: 步骤4: 将数据加载到DropDownList中 要完成的是在页面加载时,将UserAccount的Name和Id数据加载到DropDownList中。 当选择特定项时,加载更加详细的信息。 1.双击Degsin视图(F7),在后台代码中添加Page_Load事件。 2.处理Page_Load事件的代码如下: protectedvoidPage_Load(objectsender,EventArgse) { if(! IsPostBack) { LoadUserDropDownList(); } } 3.Page_Load方法中的LoadUserDropDownList方法代码如下: privatevoidLoadUserDropDownList() { ddlUsers.DataSource=fromuindb.UserAccounts_SelectAll() orderbyu.LastName selectnew{Name=u.LastName+","+u.FirstName, Id=u.Id}; ddlUsers.DataTextField="Name"; ddlUsers.DataValueField="Id"; ddlUsers.DataBind(); ddlUsers.Items.Insert(0,newListItem("CreateNewUser","")); } } 注意Linq的from语句,它调用OrderDBContainer的UserAccounts_SelectAll方法,这个方法将会执行存储过程。 DataTextField属性设置为Name,DataValueField设置为Id,这些都是在Linq查询中创建的。 设置完成后,就是绑定了。 绑定时,才真正开始调用数据库查询的操作。 最后给DropDownList添加一项“CrateNewUser.”,这项是用来区分更新和添加操作的。 现在数据库中还没有任何数据,DropDownList中只有"CreteNewUser"一项。 步骤5: 添加和更新数据 下面将向你介绍如何添加和更新表中的数据。 1.转到设计视图,双击Save按钮,创建该按钮的点击事件。 2.处理点击事件的代码如下: using(OrderDBContainerdb=newOrderDBContainer()) { UserAccountuserAccount=newUserAccount(); userAccount.FirstName=txtFirstName.Text; userAccount.LastName=txtLastName.Text; userAccount.AuditFields.UpdateDate=DateTime.Now; if(ddlUsers.SelectedItem.Value=="") { //Adding userAccount.AuditFields.InsertDate=DateTime.Now; db.UserAccounts.AddObject(userAccount); } else { //Updating userAccount.Id=Convert.ToInt32(ddlUsers.SelectedValue); userAccount.AuditFields.InsertDate=Convert.ToDateTime(lblInserted.Text); db.UserAccounts.Attach(userAccount); db.ObjectStateManager.ChangeObjectState(userAccount,System.Data.EntityState.Modified); } db.SaveChanges(); lblInserted.Text=userAccount.AuditFields.InsertDate.ToString(); lblUpdated.Text=userAccount.AuditFields.UpdateDate.ToString(); //Reloadthedropdownlist LoadUserDropDownList(); //Selecttheonetheuserjustsaved. ddlUsers.Items.FindByValue(userAccount.Id.ToString()).Selected=true; } } 代码首先创建OrderDBContainer对象,再创建UserAccount对象,用输入的值填充UserAccount对象属性。 更新日期用系统当前时间,接着判断是更新操作还是添加操作了。 最后就是更新DropDownList的值并选中刚刚操作的UserAccout。 这里的db.SaveChanges()最后实际上是在数据库中执行添加或更新语句。 想数据库添加数据时,打开SQLProfiler会看到Insert存储过程被调用。 exec[dbo].[UserAccounts_Insert] @FirstName=N'Lloyd', @LastName=N'Sheng', @AuditFields_InsertDate='2010-04-2618: 14: 42.4564241', @AuditFields_UpdateDate='2010-04-2618: 14: 42.4564241' 步骤6: 查询数据 下面是实现当用户选择某一个DropDownList项时,显示详细信息的功能。 1.双击视图设计器中的DropDownList,这时会创建DropDownList的SelectedIndexChanged方法。 2.编写SelectedIndexChanged方法的代码如下: if(ddlUsers.SelectedValue=="") { txtFirstName.Text=""; txtLastName.Text=""; lblInserted.Text=""; lblUpdated.Text=""; } else { //GettheuserfromtheDB using(OrderDBContainerdb=newOrderDBContainer()) { intuserAccountId=Convert.ToInt32(ddlUsers.SelectedValue); varuserAccounts=fromuindb.UserAccounts_SelectById(userAccountId) selectu; txtFirstName.Text=""; txtLastName.Text=""; lblInserted.Text=""; lblUpdated.Text=""; foreach(UserAccounts_Select_ResultuserAccountinuserAccounts) { txtFirstName.Text=userAccount.FirstName; txtLastName.Text=userAccount.LastName; lblInserted.Text=userAccount.AuditFields_InsertDate.ToString(); lblUpdated.Text=userAccount.AuditFields_UpdateDate.ToString(); } } } 代码根据DropDownList选择的Id,调用UserAccounts_SelectById方法从数据库中查询一条数据并且显示出来。 步骤7: 删除数据 最后就是删除数据的功能了。 1.转到视图设计器,双击“Delete”按钮。 2.添加如下代码: ifusing(OrderDBContainerdb=newOrderDBContainer()) { if(ddlUsers.SelectedItem.Value! ="") { UserAccountuserAccount=newUserAccount(); userAccount.Id=Convert.ToInt32(ddlUsers.SelectedValue); db.UserAccounts.Attach(userAccount); db.ObjectStateManager.ChangeObjectState(userAccount, System.Data.EntityState.Deleted); db.SaveChanges(); LoadUserDropDownList(); txtFirstName.Text=""; txtLastName.Text=""; lblInserted.Text=""; lblUpdated.Text=""; } } 代码首先创建了一个UserAccount对象,将它的Id设置为选中项的Id.然后将UserAccount附加到UserAccount集合中,设置它的状态为删除。 调用SaveChanges操作,将该条数据删除,刷新DropDownList的数据源,搞定! 小结 第二篇文章中告诉你如何用EntityFramework进行CRUD操作,本篇文章张告诉你如何用存储过程和EntityFramework进行CRUD操作。 在下一篇文章中我将向你介绍如何在三层结构中使用EntityFramework,希望你能喜欢。 项目代码: 本文永久链接:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Entity framework第三篇 framework 第三