VS2010+SQlite+EF 四、常用操作

来源:互联网 发布:仿mac桌面软件 编辑:程序博客网 时间:2024/05/17 02:42

经过前面三篇文章的介绍,可能有人觉得EF好像很复杂,其实EF的使用非常简单,下面就说说常见的增删改查

一、查询

EF的查询常用的方法有2种,Lamda和Linq,我个人比较习惯Linq,语法风格和SQL非常类似,例如

            using (TestDatabaseEntities testDatabase = new TestDatabaseEntities())            {                var selectedShops = from shop in testDatabase.Shops where shop.ID > 10 orderby shop.ID ascending select shop;                List<Shops> shopList = selectedShops.ToList();                dataGridView1.DataSource = shopList;            }
补充一点,List是可以直接作为DataGridView的数据源的,.NET的数据感知技术真是强大

二、插入

            using (TestDatabaseEntities testDatabase = new TestDatabaseEntities())            {                Goods good1 = new Goods();                good1.ShopID = 11;                good1.Name = "菊花茶";                good1.Price = 5.0f;                good1.Desc = "一种清凉的饮料";                testDatabase.Goods.AddObject(good1);                testDatabase.SaveChanges();            }
插入数据的时候,所有未赋值的字段都会默认为NULL,SQlite的主键列一定要记得设置自增这个选项,这个选项默认是不会开启的,即使你设置为主键。我就是因为忘记设置自增,插入数据一直报错,因为ID值重复了

三、修改

我们先写一个根据主键值得到对象的方法

        private Shops GetShop(TestDatabaseEntities testDatabase, long id)        {            Shops returnShop = null;            var selectedShop = from shop in testDatabase.Shops where shop.ID == id select shop;            List<Shops> tl = selectedShop.ToList();            returnShop = tl[0];                        return returnShop;        }
这个方法为什么要传一个TestDatabaseEntities的对象呢,因为C#的对象是引用类型,传入TestDatabaseEntities是为了确保查询得到的对象是属于TestDatabaseEntities的,如果我们用2个不同的TestDatabaseEntities对象去查询,即使得到的Shop对象里面的值完全一样,也是2个不同的对象,后续的修改和删除操作都是基于对象的,就会报错。

            long id = 2;            using (TestDatabaseEntities testDatabase = new TestDatabaseEntities())            {                Shops selectedShop = GetShop(testDatabase, id);                if (selectedShop != null)                {                    selectedShop.Address = "皇后大道东";                    testDatabase.SaveChanges();                }            }
四、删除

还是要用到上面的查询方法得到对象,然后删除

            long id = 2;            using (TestDatabaseEntities testDatabase = new TestDatabaseEntities())            {                Shops selectedShop = GetShop(testDatabase, id);                if (selectedShop != null)                {                    testDatabase.Shops.DeleteObject(selectedShop);                    testDatabase.SaveChanges();                }            }

五、分页查询

分页查询要用到2个Linq语法

Skip(n):在结果集中跳过前面n条记录

Take(n):取结果集中的n条记录

        private List<Shops> GetShopsPage(int pageIndex, int pageSize)        {            List<Shops> tList = null;            using (TestDatabaseEntities testDatabase = new TestDatabaseEntities())            {                var selectedRecords = from a in testDatabase.Shops orderby a.ID ascending select a;                var selectedPage = selectedRecords.Skip((pageIndex - 1) * pageSize).Take(pageSize);                tList = selectedPage.ToList();            }            return tList;        }

Linq语法只会在真正取数据的时候才会解释并执行,所以上面的代码并不会先从数据库将所有数据查询出来,然后再来查询子集。所以Linq在查询大量数据的时候,执行效率和原生SQL没什么区别

六、执行SQL语句

            using (TestDatabaseEntities testDatabase = new TestDatabaseEntities())            {                string strSql = "update Shops set Address='忠孝东路' where ID=3";                int i = testDatabase.ExecuteStoreCommand(strSql, null);                if (i > 0)                {                    MessageBox.Show("执行成功");                }                else                {                    MessageBox.Show("执行失败");                }            }
ExecuteStoreCommand相当于ADO.NET的ExecuteNoneQuery

七、修改数据库结构

无论什么项目,即使前期考虑的再周全,开发过程中仍免不了会出现数据库结构变更的情况,这时候EF的强大就体现出来了。

当数据库结构变化之后,比如新增了字段,新增了表,我们只需要在解决方案管理器中双击edmx文件,来到可视化界面,在空白处右键全选,删除,将原来的全部删掉。

然后,在空白处右键,选择“从数据库更新模型”,所有数据访问层的代码就重新自动生成了,就是这么简单


总结:

EF是与VS结合的最好的ORM框架,简单易用,尤其适合中小型项目的快速开发。

如果一定要挑一点缺点的话,就是对于复杂一点的数据库操作,还是要加一些代码的,比如分页查询,多表查询等


练习程序地址:http://pan.baidu.com/s/1hsmOQvq


0 0