entity framework 新手入门篇(2)-entity framework基本的增删改查
经过前两节的简单描述,终于可以进入entity framework的使用部分了。本节将对entity framework原生的增删改查进行讲解。
承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表。
一、entity framework 相关类的理解。
首先,House数据库在映射后会生成一个名为HouseEntities的类,这个类我们称之为数据上下文,可以简单的理解为数据库的部分映射(如果映射了全部的表,视图,存储过程,则可看作全部映射)。
使用数据库的时候,不需要像ADO.NET那样,显式的创建sqlconnection。sqlcommand,sqldataadapter,连接数据库只需要创建一个数据上下文的实例即可,创建实例的过程,即可看作创建了数据连接。当然,创建了连接是要关闭的,否则会增大连接池的负担。因此,在entity framework中最常用using的方式来确保连接会被关闭。
using (HouseEntities db = new HouseEntities())
{//新建了一个数据上下文,它实现了IDisposable接口,使用USING可以确保其最终被dispose。如果不是用using,请在返回前主动调用db.Dispose();
}
上面的代码新建了一个数据上下文对象,相当于简单的new了一个sqlconnection。然后con.open,con.close。期间没有做任何操作
数据上下文实例中,包含着所有表与视图的映射,我们称之为实体集,它是由db.House这样的形式来进行调用的,可以简单理解为数据表,而House类则是实体类,可以看作一条数据的实例化映射。这样说可能会有点抽象,那下面我们将用一个例子来演示如何进行添加操作。
二、entity framework 添加数据
House house = new House()
{
Area = 10.2m,
Seller_ID = ,
Floor = ,
Street = "南京路",
Name = "第一百货商店",
Price = 99999.1m,
Region = "黄浦区"
};
using (HouseEntities db = new HouseEntities())
{
house = db.House.Add(house);
db.SaveChanges();
//db是数据上下文,House是数据实体类的一个集合,Add方法用于向上下文中添加实例,最后必须要经过db.savingchanges()来进行数据存储
}
上面的例子相当于执行了insert into House并给参数赋值的SQL命令,需要注意的是,在生成实体类对象的时候,必须要给所有非空字段赋值,哪怕你给这个字段指定过默认值,其次,就是在所有添加,修改,删除操作的时候,必须要进行db.savingchanges(),这个方法会让EF比较提取出的部分与数据库之间的差异,并生成SQL语句完成修改。
上面的话也许比较难以理解,总之,添加数据就是1.新建一个实体类的对象,2,新建一个数据上下文,把实体类对象附加到上下文,3.savingchanges来提交更改。
如果我们需要知道添加是否成功,savingchanges时会返回受到影响的行数,我们可以通过它来判断是否执行成功。
如果我们需要添加多条数据,可以在将所有实例都ADD进上下文之后在进行savingchanges,此时数据将会被一次提交。
如果我们需要在本条数据添加成功后调取ID,在执行完savingchanges后,可以直接以实体类对象.id的形式来直接调用。
二、查询数据
/// <summary>
/// 通过ID查找House
/// </summary>
/// <param name="id">House的ID</param>
/// <returns>查找到的HOUSE</returns>
public static House GetHouseByID(int id)
{
House house = null; //需要返回的house
using (HouseEntities db = new HouseEntities())
{
house = db.House.Where(x => x.ID == id).FirstOrDefault();
//db是数据上下文,House是数据实体类的一个集合,where里是lambda表达式,进行查询
//最后的FirstOrDefault是取第一条或默认,如果取不到对应条件的数据则会返回NULL
}
return house;
}
以上代码就是根据id查询单条数据的原生方法了,由于未对数据库做任何更改,所以不需要进行savingchanges。
在查询时,虽然有first这样的方法,但我们仍旧应该坚持使用firstordefault来确保查询条件不会引发错误。
/// <summary>
/// 通过地区查找Houses
/// </summary>
/// <param name="region">House所在区域</param>
/// <returns>查找到的HOUSES</returns>
public static List<House> GetHousesByRegion(string region)
{
List<House> houses = null; //需要返回的house列表
using (HouseEntities db = new HouseEntities())
{
houses = db.House.Where(x => x.Region == region).ToList();
//查询条件后跟ToList方法,就可以获得指定条件下的数据表了
}
return houses;
}
上面的代码,可以让我们根据地区来查找房屋列表,返回的对象是一个泛型的List,可以简单理解为ADO.NET中的dataTable,当然,它也是可枚举类型,所以,你仍旧可以直接将其绑定到GridView,Repeater,DropDownList等数据控件中。
三、修改数据
EF原生的数据修改需要一个特别的操作,attach,这个操作可以将某个新生成的对象附加到数据上下文中。
/// <summary>
/// 更新House
/// </summary>
/// <param name="house">House的实例</param>
/// <returns>是否成功</returns>
public static bool UpDateHouse(House house)
{
bool isComplete = false; //需要返回的bool
using (HouseEntities db = new HouseEntities())
{
house = db.House.Attach(house);
db.Entry(house).State = System.Data.Entity.EntityState.Modified;
isComplete = db.SaveChanges() > 0;
//对于无法验证是否存在于映射中的实例,首先要进行attach操作,其次,为了保证update指令被执行,我们还需要entry到这个数据上下文的实例汇中,把它的状态设置为已修改
}
return isComplete;
}
上面的方法可以确保数据会被修改,但我们仍需注意,如果传入的house与映射中的house相比毫无变化的话,受影响行数仍旧为0,提示将会是修改失败,这点与ADO.NET有明显差异。
四、删除数据
/// <summary>
/// 通过ID删除House
/// </summary>
/// <param name="id">需要删除的house的ID</param>
/// <returns>是否执行成功</returns>
public static bool DeleteHouseByID(int id)
{
bool isComplete = false; //是否执行成功
using (HouseEntities db = new HouseEntities())
{
var house = db.House.Where(x => x.ID == id).FirstOrDefault();
//首先查询需要删除的house
db.House.Remove(house);
//然后执行remove方法,将对象从映射中移除
isComplete = db.SaveChanges() > ;
}
return isComplete;
}
删除数据的时候,首先需要查找相对的对象,之后从映射中移除,最终进行savingchanges。
以上就是EF最基本的增删改查了,其中的删除,修改操作与ADO.NET相比,不仅代码有差异,思想上也有不小的出入,需要多加理解才能运用自如。
下一节,我们将讲如何解提取部分字段,使用orderby,groupby,like等关键字。
相比原生AOD.NET,EF的修改和删除不仅显得臃肿,而且很难搞定批量修改,批量删除的操作,第四节,我们将讲解如何执行类似于delete house where region='黄浦区'的方法。
entity framework 新手入门篇(2)-entity framework基本的增删改查的更多相关文章
- 【基础篇】js对本地文件增删改查
[基础篇] js对本地文件增删改查--增 js对本地文件增删改查--删 js对本地文件增删改查--改 js对本地文件增删改查--查
- 【基础篇】js对本地文件增删改查--查
前置条件: 1. 本地有安装node,点击传送门 项目目录: 1. msg.json内容 { "data": [ { "id": 1, "name&q ...
- 【基础篇】js对本地文件增删改查--改
前置条件: 1. 本地有安装node,点击传送门 项目目录: 1. msg.json内容 { "data": [ { "id": 1, "name&q ...
- 【基础篇】js对本地文件增删改查--删
前置条件: 1. 本地有安装node,点击传送门 项目目录: 1. msg.json内容 { "data": [ { "id": 1, "name&q ...
- 【基础篇】js对本地文件增删改查--增
前置条件: 1. 本地有安装node,点击传送门 项目目录: 1. msg.json内容 { "data": [ { "id": 1, "name&q ...
- entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等
前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和 ...
- Entity Framework应用:根据实体的EntityState状态实现增删改查
在上一篇文章中,我们讲解了使用EF实现简单的增删改成,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查. 一.修改数据 上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询 ...
- entity framework 新手入门篇(1)-建立模型
entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下 ...
- entity framework 新手入门篇(4)-entity framework扩展之 entityframework.extended
对于EF的操作,我们已经有了大概的了解了,但对于实战来说,似乎还欠缺着一些常用的功能,那就是批量的删除,更新数据. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller ...
随机推荐
- jQuery事件绑定on()、bind()与delegate() 方法详解
jquery中有四种事件绑定函数,bind(),live(),on(),delegate(),由于live现在并不常用,因此不做过多解释. 1. bind()用法 $("div p" ...
- FPGA图像处理 两路sensor的色调不一致
怎么调?可以让两路sensor的色调一致.
- js字符串和正则表达式中的match、replace、exec等的配合使用
正则并不是经常使用,而正则和字符串之间的函数关系又错综复杂,谁是谁的函数,又是怎么样的一种结果,往往我们是看一遍忘一遍,对此我是头疼不已,感觉自己是个笨蛋^_^. 为了以后不再查文档,特此把常用的函数 ...
- CentOS下 MySQL5.7 详细的部署安装流程
MySQL5.7.14安装过程: 下载5.7版本:wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.14-linux-glibc2 ...
- Codeforces Round #375 (Div. 2) F. st-Spanning Tree
传送门 分析:构造题.可以这么想:先把s,t两个点去掉,把剩下的点先并查集合并.这样会出现个集合:, , 个剩余集合.那么个集合中先把只能与或中一个相连的连起来,如果这样已经超出了要求,那么就不能构造 ...
- jQuery 点击显示再次点击隐藏
<html> <head> <script type="text/javascript" src="/jquery/jquery.js&qu ...
- action和servlet的关系
在struts2.0中,可以通过ServletActionContext.getRequest()获取request对象. 在action的方法中return一个字符串,该字符串对应struts. ...
- 用Object字面量来代替swtich/if...else
很多时候,if...else...有很多判断分支选项,就会见到: if (animal === 'dog') { // TO DO 'dog' } else if (animal === 'cat') ...
- 使用C++11的一点总结
C++11已不是新鲜技术,但对于我来说,工作中用得还不够多(前东家长时间使用gcc3.4.5,虽然去年升了4.8.2,但旧模块维护还是3.4.5居多:新东家用的是4.4.6,不能完整支持C ...
- 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...