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 = 1,
                Floor = 1,
                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() > 0;
            }
            return isComplete;
        }

删除数据的时候,首先需要查找相对的对象,之后从映射中移除,最终进行savingchanges。

以上就是EF最基本的增删改查了,其中的删除,修改操作与ADO.NET相比,不仅代码有差异,思想上也有不小的出入,需要多加理解才能运用自如。

下一节,我们将讲如何解提取部分字段,使用orderby,groupby,like等关键字。

相比原生AOD.NET,EF的修改和删除不仅显得臃肿,而且很难搞定批量修改,批量删除的操作,第四节,我们将讲解如何执行类似于delete house where region=‘黄浦区‘的方法。

时间: 2024-10-12 19:45:50

entity framework 新手入门篇(2)-entity framework基本的增删改查的相关文章

entity framework 新手入门篇(3)-entity framework实现orderby,count,groupby,like,in,分页等

前面我们已经学习了entityframework的基本的增删改查,今天,我们将在EF中实现一些更加贴近于实际功能的SQL方法. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表. 在本次学习之前,我们先要了解一个神奇的接口,iqueryable这个接口类似于ienumable,但并不完全相同,Iqueryable是可查询类型需要实现的最重要的接口,在其Count,ToList,ToArray之后才会真正执行查询,所以,为了保证性能,请尽量在最后一步在进行Co

Entity Framework应用:根据实体的EntityState状态实现增删改查

在上一篇文章中,我们讲解了使用EF实现简单的增删改成,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查. 一.修改数据 上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询出来要修改的数据,然后在修改.但是这种操作会导致多次操作数据库: 从上面的截图中可以看出,查询数据的时候会执行一次事物,修改的时候又执行了一次事物,即修改数据会操作两次数据库.那么有没有什么方法可以只操作一次数据库呢?那就是下面要讲解的EntityState. 使用EntityState优化上面的修

entity framework 新手入门篇(1)-建立模型

entity framework是微软官方免费提供给大家的一套ORM(Object Relational Mapping对象关系映射)解决方案.它不仅可以帮助我们解决数据缓存的问题,还能在最小的开销下实现完全的OO(Object Oriented面向对象)编程.实乃中小项目中敏捷开发的一大福祉.博主作为一只刚入本行的菜鸟,有幸参加开发了几个使用entity framework(以下简称EF)的项目,虽然在这些项目开发的过程中,走了许多的弯路,网上的资料也不甚齐全.在摸爬滚打了一年之后,也算有了一

entity framework 新手入门篇(4)-entity framework扩展之 entityframework.extended

对于EF的操作,我们已经有了大概的了解了,但对于实战来说,似乎还欠缺着一些常用的功能,那就是批量的删除,更新数据. 承接上面的部分,我们有一个叫做House的数据库,其中包含house表和seller表. 一.使用原生EF如何实现批量删除和修改? //批量修改 public static bool UpdateAllPrice(decimal price) { bool isOk = false; using (HouseEntities db = new HouseEntities()) {

entity framework 新手入门篇(1.5)-lambda表达式与linq

在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以lambda表达式为例: x=>x+1;就是一个完整的lambda表达式. 其等同于一个匿名的方法: int anonymous(int x) { return x+1; } 考虑一下这个方法中最重要的部分,也就两个部分:传入的参数,返回的参数. 返回值类型,参数类型都是可以进行推断的,就像C#中的VA

使用MVC5+Entity Framework6的Code First模式创建数据库并实现增删改查功能

此处采用VS2017+SqlServer数据库 一.创建项目并引用dll: 1.创建一个MVC项目 2.采用Nuget安装EF6.1.3 二.创建Model 在models文件夹中,建立相应的model文件,这里建立的class名,就是数据库里表的名字.        在这里面,可以建立表之间的关系,本次将建立Course(课程).Student(学生).StuCourse(课程学生关系)来作为一个Demo [Table("t_course")]   //可以通过Attribute的形

【andorid基础篇】数据库的创建以及增删改查

I,安卓下的数据库 安卓下使用的数据库是SQLite,安卓为我们提供的API是SQLiteOpenHelper. 1,创建一个数据库 1)写一类去继承抽象类SQLiteOpenHelper,我们需要复写相关的方法: 1 public WcxSQLite(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version); 3 } 4 5 public v

【Mybatis】Mybatis入门概述及第一个Mybatis实例实现增删改查

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.简介 1.什么是MyBatis MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录.(类似

entity framework—简单的增删改查

应用程序对数据库执行CRUD时,通过entity framework方式,实际上是对DbContext的操作,DbContext是EF的入口,DbContext拿到对应的消息(CRUD)后,通过ORM中的Mapping来将对象O映射成数据库中的关系R. 下面就简单的实现一下利用entity framework实现简单的增删改查.首先要说明的是我已经建立了在解决方案中映射了数据库中表"Customer".所有的操作都是针对这张表. 1.增加 Customer customer = new