使用EF的Code First模式操作数据库

2022-04-17 07:06:13

EF的核心程序集位于System.Data.Entity.dll和System.Data.EntityFramework.dll中。tName在数据库中的类型是nvarchar(max),这些都是在使用EF时必须注意的命名规格。

四、执行简单的CRUD操作

1、创建记录-Create

你可以这样认为,将对象添加到集合中就相当于将数据插入到数据库相应的表中。我们使用DbSet的Add方法来实现新数据的添加,而DbContext类的SaveChanges方法会将未处理的更改提交到数据库,这是通过检测上下文中所有的对象的状态来完成的。所有的对象都驻留在上下文类的DbSet属性中。比如,例子中有一个Products属性,那么所有的产品数据都会存储到这个泛型集合属性中。数据库上下文会跟踪DbSet属性中的所有对象的状态,这些状态有这么几种:Deleted、Added、Modified和Unchanged。如果你想在一个表中插入多行数据,那么只需要添加该表对应的类的多个对象的实例即可,然后使用SaveChanges方法将更改提交到数据库,该方法是以单事务执行的。最终,所有的数据库更改都会以单个工作单元持久化。既然是事务,那么就允许将批量相关的更改作为单个操作提交,这样就保证了事务一致性和数据完整性。

修改Main方法如下:

using CodeFirstAppDemo.EFDbContext;using CodeFirstAppDemo.Models;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace CodeFirstAppDemo{    class Program    {        static void Main(string[] args)        {            // 使用数据库上下文Context            using (var context = new Context())            {                 // 如果数据库不存在,则调用EF内置的API创建数据库                if (context.Database.CreateIfNotExists())                {                    Console.WriteLine("数据库创建成功!");                }                else                {                    Console.WriteLine("数据库已存在");                }                #region EF 添加数据                //添加数据                var cate = new List<Category> {                   new Category{                    CategoryName="文学类",                    ProductList=new List<Product>{                          new Product                   {                     ProductName="百年孤独",                     Price=37.53m,                     PublicDate=new DateTime(2011,6,1)                   },                     new Product                   {                     ProductName="老人与海",                     Price=37.53m,                     PublicDate=new DateTime(2010,6,1)                   }                      }                   },                    new Category{                    CategoryName="计算机类",                    ProductList=new List<Product>{                          new Product                   {                    ProductName="C#高级编程第九版",                     Price=48.23m,                     PublicDate=new DateTime(2016,2,8)                   },                    new Product                   {                     ProductName="Oracle从入门到精通",                     Price=27.03m,                     PublicDate=new DateTime(2014,7,9)                   }                      }                   }                };                //将创建的集合添加到上下文中                context.Categorys.AddRange(cate);                //调用SaveChanges()方法,将数据插入到数据库                context.SaveChanges();                #endregion            }            Console.ReadKey();        }    }}

这里需要注意两点:
1、不需要给Product.Id属性赋值,因为它对应到SQL Server表中的主键列,它的值是自动生成的,当SaveChanges执行以后,打断点就能看到返回的Product.Id已经有值了。
2、Context的实例用了using语句包装起来,这是因为DbContext实现了IDisposable接口。DbContext还包含了DbConnection的实例,该实例指向了具有特定连接字符串的数据库。在EF中合适地释放数据库连接和ADO.NET中同等重要。

2、查询记录-Retrieve

查询时也是直接通过DbSet进行查询的:

using CodeFirstAppDemo.EFDbContext;using CodeFirstAppDemo.Models;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace CodeFirstAppDemo{    class Program    {        static void Main(string[] args)        {            // 使用数据库上下文Context            using (var context = new Context())            {                 // 如果数据库不存在,则调用EF内置的API创建数据库                if (context.Database.CreateIfNotExists())                {                    Console.WriteLine("数据库创建成功!");                }                else                {                    Console.WriteLine("数据库已存在");                }                #region EF 2查询数据                //查询方式1                var products = from p in context.Categorys select p;                foreach (var item in products)                {                    Console.WriteLine("分类名称:" + item.CategoryName);                }                //查询方式2                //延迟加载 cates里面没有数据                var cates = context.Categorys;                //执行迭代的时候才有数据                foreach (var item in cates)                {                    Console.WriteLine("分类名称:" + item.CategoryName);                }                #endregion            }            Console.ReadKey();        }    }}

如果像下面那样打一个断点,你会看到一个结果视图,点击类似刷新的图标会看到查询的结果,这个东西道出了EF中很重要的一个概念:延迟加载。此时还没有真正查询数据库,只有当LINQ的查询结果被访问或者被枚举时才会将查询命令发送到数据库。EF是基于DbSet实现的IQueryable接口来处理延迟查询的。

3、更新记录-Update

在SQL中,更新需要执行Update命令。而在EF中,我们要找到DbSet实体集合中要更新的对象,然后修改其属性,最后调用SaveChanges方法即可。

using CodeFirstAppDemo.EFDbContext;using CodeFirstAppDemo.Models;using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace CodeFirstAppDemo{    class Program    {        static void Main(string[] args)        {            // 使用数据库上下文Context            using (var context = new Context())            {                  // 如果数据库不存在,则调用EF内置的API创建数据库                if (context.Database.CreateIfNotExists())                {                    Console.WriteLine("数据库创建成功!");                }                else                {                    Console.WriteLine("数据库已存在");                }                #region EF 更新数据                var products = context.Products;                if (products.Any())                {                    // 查询产品名称是“百年孤独”的产品                    var toUpdateProductCkmDegkWSR = products.First(p => p.ProductName == "百年孤独");                    // 修改查询出的产品名称                    toUpdateProduct.ProductName = "唐诗三百首";                    // 调用SaveChanges()方法保存数据                    context.SaveChanges();                }                #endregion            }            Console.ReadKey();        }    }}

这里我们使用了Any()扩展方法来判断序列中是否有元素,然后使用First()扩展方法来找到Name=="百年孤独"的元素,然后给目标对象的Name属性赋予新值,最后调用SaveChanges()方法保存数据。

4、删除记录-Delete

要删除一条数据,就要先找到这条数据.

using CodeFirstAppDemo.EFDbContext;using CodeFirstAppDemo.Models;using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;namespace CodeFirstAppDemo{    class Program    {        static void Main(string[] args)        {            // 使用数据库上下文Context            using (var context = new Context())            {                 // 如果数据库不存在,则调用EF内置的API创建数据库                if (context.Database.CreateIfNotExists())                {                    Console.WriteLine("数据库创建成功!");                }                else                {                    Console.WriteLine("数据库已存在");                }                #region EF 删除数据                var products = context.Products;                // 先根据ProductName找到要删除的元素                var toDeleteProduct = context.Products.Single(p => p.ProductName == "唐诗三百首");                if (toDeleteProduct != null)                {                // 方式1:使用Remove()方法移除                context.Products.Remove(toDeleteProduct);                // 方式2:更改数据的状态                context.Entry(toDeleteProduct).State = EntityState.Deleted;                // 最后持久化到数据库                context.SaveChanges();                #endregion            }            Console.ReadKey();        }    }}

到此这篇关于使用EF的Code First模式操作数据库的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。