EF的ObjectContext的增删改查

转:http://blog.csdn.net/mynewdays/article/details/7822412

1)在VS中新建项目(使用VS2010),项目名称为"MyEF。"控制台应用程序,Winform,以及Web程序都可以,这里使用Winform程序做Demo。在窗体上添加三个按钮,分别为“添加”,“修改”,“删除”

2)在项目“MyEF”单击鼠标右键,在弹出的菜单中选择“添加”-“新建项”,在弹出的窗口中,选择左边“数据”,然后在右边选择“ADO.NET实体数据模型”,如图2-1


3)单击“添加”按钮,弹出“实体数据模型向导”,选择“从数据库生成”,然后单击“下一步”,弹出建立数据库连接界面

4)单击“新建连接”按钮,在弹出的”连接属性“窗口中选择服务器,登录方式和数据库之后单击下一步,如图4-1


5)单击”确定“,回到”选择您的数据连接“窗口,选中”是,在连接字符串中包含敏感数据“,单击”下一步“,弹出”选择数据库对象“窗口

6)选择要操作的表,如图6-1,然后单击完成。需要注意的是,表中一定要有主键


7)在解决方案资源管理器中多了一个”Model1.edmx“,如图7-1



8)双击”Model1.Designer.cs“,打开代码窗口,展开”上下文“,如图8-1所示


9)类的名称为”HBSIEntities“,顾名思义,里面存放的是HBSI数据库中你选择的表的实体。当然很多方法是存储在父类ObjectContext中的。就用HBSIEntities类来完成增删改查的操作。

10)添加:在”添加“按钮的单击事件中编写如下代码,注释写得很清楚,就不多说了

 

[csharp] view plaincopy
 
  1. <span style="font-size:14px;"><span style="white-space:pre">    </span>    HBSIEntities entity = new HBSIEntities();  
  2.             /*新建一个T_UserInfo表的实体, 
  3.              * 即一个新行,为新行中的每一个字段赋值, 
  4.              * 要明白,一个表可以看做一个实体, 
  5.              * 表中的一行也可以看做一个实体*/  
  6.             T_UserInfo userinforow = new T_UserInfo()  
  7.             {  
  8.                 UserName = "bj",  
  9.                 Pwd = "123456",  
  10.                 NickName = "猪八戒",  
  11.                 Address = "高老庄",  
  12.                 Sfzh = "123452223333444423"  
  13.             };  
  14.             /*将新建的行实体添加到表实体中, 
  15.              这个操作是在程序层面操作的, 
  16.              * 并不会影响到数据库层面*/  
  17.             entity.T_UserInfo.AddObject(userinforow);  
  18.             /*将程序层面的实体的改变更新到数据源中, 
  19.              通过这行代码,就会向数据库中添加一条数据*/  
  20.             entity.SaveChanges();</span>  

11)修改:见代码

 

 

[csharp] view plaincopy
 
  1. HBSIEntities entity = new HBSIEntities();  
  2.       /*更改表的实体,注意在最后加上了“Id=7”, 
  3.        标识要更改实体表T_UserInfo中Id=7的行实体, 
  4.        为字段重新赋值即可*/  
  5.       T_UserInfo userinforow = new T_UserInfo()  
  6.       {  
  7.           UserName = "zbj",  
  8.           Pwd = "234567",  
  9.           NickName = "二师兄",  
  10.           Address = "高老庄",  
  11.           Sfzh = "123452223333444423",  
  12.           Id=7  
  13.       };  
  14.       /*将改变的行实体附加到表实体中, 
  15.        注意此时只是在程序层面对表实体进行更改*/  
  16.       entity.T_UserInfo.Attach(userinforow);  
  17.       /*使用对象状态管理器ObjectStateManager 
  18.        * 标识实体userinforow的状态为“更改”而不是“删除”, 
  19.        EntityState有很多枚举值,可以自己查看,一看即懂*/  
  20.       entity.ObjectStateManager.ChangeObjectState(userinforow,EntityState.Modified);  
  21.   
  22.       /*将程序层面的实体的改变更新到数据源中, 
  23.        通过这行代码,就会更改数据库中对应表中的数据*/  
  24.       entity.SaveChanges();  


12)先说删除,和更改很想,只需要改2点。第一是在创建行实体的时候里面只需为Id属性赋值即可,因为我们都是根据主键来删除的,知道别的字段的值没意义;第二就是更改EnrityState的枚举值为Delete即可,见代码

 

 

[csharp] view plaincopy
 
  1. HBSIEntities entity = new HBSIEntities();              
  2.             T_UserInfo userinforow = new T_UserInfo()  
  3.             {                  
  4.                 <span style="color:#ff0000;">Id = 7</span>  
  5.             };             
  6.             entity.T_UserInfo.Attach(userinforow);             
  7.             entity.ObjectStateManager.ChangeObjectState(userinforow, <span style="color:#ff0000;">EntityState.Deleted</span>);  
  8.             entity.SaveChanges();  


13)更改是需要着重强调一点,创建要更改的行实体时,所有字段都要赋值,如我们本来只想为NickName属性改变之为”二师兄“,其余字段的值并不像更改,但仍然需要为其余字段赋上原值,否则更新到数据库中后,字段的值会成为Null。

 

14)查询:这里只说简单查询,即便利输出所有数据,复杂查询留到下一篇再说,见代码

 

[csharp] view plaincopy
 
  1. HBSIEntities entity = new HBSIEntities();  
  2.             StringBuilder stb = new StringBuilder();  
  3.             /*循环中的item标识表中的行*/  
  4.             foreach (var item in entity.T_UserInfo)  
  5.             {  
  6.                 stb.AppendFormat("编号为{0},用户名为{1},密码为{2},昵称为{3}",item.Id,item.UserName,item.Pwd,item.NickName+"\n");  
  7.             }  
  8.             MessageBox.Show(stb.ToString());  

结果如14-1 

posted @ 2015-08-14 11:09  清幽紫竹  Views(1056)  Comments(0)    收藏  举报