Entity Framework 学习系列(4) - EF 增删改
写在前面
在上一小节中,学习了如何 通过Code First + MySql 的方式实现数据的迁移。
这一下节中,总结 EF的增删改。
一、开发环境
- 
开发工具:Visual Studio 2019 
- 
开发环境:Win 10 家庭版 
- 
数据库:MySQL 8.0.17 
二、创建项目
1.打开Visual Studio 2019 新建->创建程序台应用

2.安装 MySQL.Data 6.10.9
- 工具->NuGet包管理器->管理解决方案的NuGet程序包->浏览

3.安装 MySQL.Data.Entity 6.10.9
- 工具->NuGet包管理器->管理解决方案的NuGet程序包->浏览

4.创建Categories类型表以及Shippers供应商表
- Categories类型表
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace myEFCodeFirst_04.Models
{
    public class Categories
    {
        [Description("类型ID")]
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CategoryId { get; set; }
        [Description("类型名称")]
        public string CategoryName { get; set; }
        [Description("类型说明")]
        public string Description { get; set; }
        [Description("创建时间")]
        public DateTime createTime { get; set; }
    }
}
- Shippers供应商表
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace myEFCodeFirst_04.Models
{
    [Description("供应商")]
    public class Shippers
    {
        [Description("供应商Id")]
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ShipperId { get; set; }
        [Description("供应商名称")]
        public string CompanyName { get; set; }
        [Description("电话号码")]
        public string Phone { get; set; }
    }
}
5.使用Code First 方式创建上下文类
using myEFCodeFirst_04.Models;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace myEFCodeFirst_04
{
    //选择MySQL数据
    [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
    public class DatabaseContext:DbContext
    {
        public DatabaseContext() : base("name=MqConn") { }
        public DbSet<Productus> productus { get; set; }
        public DbSet<Categories> categories { get; set; }
        public DbSet<Shippers> shippers { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
        }
    }
}
6.打开App.config修改连接字符串
<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<configSections>
		<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
	</configSections>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
	</startup>
	<entityFramework>
		<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
			<parameters>
				<parameter value="mssqllocaldb" />
			</parameters>
		</defaultConnectionFactory>
		<providers>
			<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
		</providers>
	</entityFramework>
	<connectionStrings>
		<add name="MqConn" connectionString="Data Source=localhost;User Id=root;Password=root;database=EFFirstCodeDb;" providerName="MySql.Data.MySqlClient"/>
	</connectionStrings>
</configuration>
7.实现数据迁移
- 
工具->NuGet包管理器->NuGet包管理器控制台 
- 
输入命令: Enable-Migrations在项目中自动自动创建了Migrations文件夹
- 
输入命令: Add-Migration Initials初始化数据
- 
输入命令: update-database更新数据库
至此,项目的前期准备完成。接下来完成,数据的的基本操作。
三、新增
1.单表新增
- 使用Add() 方法执行添加
static void Add() {
     //1.声明上下文依赖
     using (DatabaseContext _db = new DatabaseContext()) 
     {
          //2.声明对象,初始化数据
          Shippers sip = new Shippers 
          {
                 ShipperId = 1,
                 CompanyName = "中山有限公司",
                 Phone = "17818979133"
          };
          //3.附加到EF中
          _db.shippers.Add(sip);
          //4.执行新增操作
          if (_db.SaveChanges() > 0) { Console.WriteLine("添加成功"); Console.ReadKey(); }
          else { Console.WriteLine("添加失败!"); Console.ReadKey(); }
       }
}
- 使用Entry() 方法进行添加
static void Add(){
    //1.声明上下文依赖
    using(DatabaseContext _db=new DatabaseContext())
    {
        //2.声明对象,初始化数据
        Shippers sip = new Shippers 
        {
              ShipperId = 1,
              CompanyName = "中山有限公司",
              Phone = "17818979133"
         };
         //3.使用Entity需要引用 using System.Data.Entity.Infrastructure;
         DbEntityEntry<Shippers> sp=_db.Entry<Shippers>(sip);
         //4.需要引用 using.Data.Entity;
         sp.State=EntityState.Added;
        //5.执行添加
        if (_db.SaveChanges() > 0) { Console.WriteLine("添加成功"); Console.ReadKey(); }
        else { Console.WriteLine("添加失败!"); Console.ReadKey(); }
    }
}
2.批量新增
static void batchAdds()
{
   //1.声明上下文依赖
    using(DatabseContext _db=new DatabaseContect())
    {
        //2.开始循环
         for (int i = 0; i < 30; i++)
         {
             //3.声明实体对象
             Shippers batchs = new Shippers
             {
                  CompanyName = "供应商" + i,
                  Phone = "供应商电话" + i,
             };
             //4.附加到EF中
             _db.shippers.Add(batchs);
         }
         //5.执行批量操作
        if (_db.SaveChanges() > 0) { Console.WriteLine("批量添加成功"); Console.ReadKey(); }
        else { Console.WriteLine("批量添加失败"); Console.ReadKey(); }
    }
}
3.多表新增
static void Adds()
{
    //新增1
    Shippers sip = new Shippers
    {
         ShipperId = 2,
         CompanyName = "中山文莱有限公司",
         Phone = "17818978114"
    };
    //1.声明上下文依赖
    using(DatabaseContext _db=new Database())
    {
        _db.shippers.Add(sip);
        //2.新增数据2
        Categories cats = new Categories 
        {
             CategoryId = 1,
             CategoryName = "休闲鞋",
             Description = "休闲鞋是鞋类的一种,主要特色是以一种简单,舒适的设计理念,满足人们日常生活穿着的需求",
             createTime = DateTime.Now
        };
        //附加到EF中
        _db.categories.Add(cats);
        //3.修改
        //查询一个需要修改的对象,此时返回的是一个代理类型对象
        Shippers editsps = new Shippers { ShipperId = 1, CompanyName = "中山" };
        //将对象加入EF容器
        DbEntityEntry<Shippers> entity = _db.Entry<Shippers>(editsps);
        //获取当前实体对象的状态管理对象
        entity.State = EntityState.Unchanged;
        //设置改对象 某属性 为修改状态,同时 entity,state 被修改为modified状态
        entity.Property("CompanyName").IsModified = true;
        //4.删除
        //构建删除对象
        Categories delcts = new Categories { CategoryId = 1 };
        //附加到EF中
        _db.categories.Attach(delcts);
        //标记为删除
        _db.categories.Remove(delcts);
        //执行操作
        if (_db.SaveChanges() > 0) { Console.WriteLine("成功"); Console.ReadKey(); }
        else { Console.WriteLine("失败"); Console.ReadKey(); }
    }
}
四、编辑
1.先查询,后编辑
static void QueryEdit()
{
    using (DatabaseContext _db = new DatabaseContext()) 
    {
        //1.查询一个需要修改的对象,此时返回的是一个代理类型对象
        Categories qycts = _db.categories.Where(c => c.CategoryId == 1).FirstOrDefault();
        //2.编辑内容 此时其实操作的是代理类型对象的属性,这些属性会将值设置给内部的对象
        //对应的属性,同时标记此属性已修改状态
        Console.WriteLine("编辑之前:" + qycts.CategoryName);
        //3.重新保存到数据库
        //注意:此时EF上下文会检查容器内部所有的对象,先找到标记
        //为修改的对象,然后找到标记为修改的对象属性,生成对应的Update语句执行
        qycts.CategoryName = "供应商1";
        if (_db.SaveChanges() > 0) { Console.WriteLine("编辑成功"); Console.ReadKey(); }
        else { Console.WriteLine("编辑失败"); Console.ReadKey(); }
    }
}
2.创建实体,后编辑
- 方法1
static void CreateEdit()
{
    using (DatabaseContext _db=new DatabaseContext())
    {
        //1.创建对象
        Categories Editcts = new Categories
        {
                CategoryId = 1,
                CategoryName = "修改类型名称",
                Description = "修改类型描述",
                createTime = DateTime.Now    
        };
        //2.将对象加入EF容器,并获取当前实体对象的状态管理对象
        DbEntityEntry<Categories> EdEntity = _db.Entry<Categories>(Editcts);
        //3.设置对象为被修改过
        dEntity.State = EntityState.Unchanged;
        //4.设置改对象 某属性 为修改状态,同时 entity,state 被修改为modified状态
        EdEntity.Property("CategoryName").IsModified=true;
        //5.执行编辑操作
        if (_db.SaveChanges() > 0) { Console.WriteLine("编辑成功"); Console.ReadKey(); }
        else { Console.WriteLine("编辑失败"); Console.ReadKey(); }
    }
}
- 方法2
static void CreateEdit()
{
    using (DatabaseContext _db=new DatabaseContext())
    {
        //1.创建对象
        Categories Editcts = new Categories
        {
                CategoryId = 1,
                CategoryName = "修改类型名称",
                Description = "修改类型描述",
                createTime = DateTime.Now    
        };
        //2.附加到EF中
        var u = _db.categories.Attach(Editcts);
        //3.标记修改的字段
        u.CategoryName = "修改类型名称";
        //4.执行编辑操作
        if (_db.SaveChanges() > 0) { Console.WriteLine("编辑成功"); Console.ReadKey(); }
        else { Console.WriteLine("编辑失败"); Console.ReadKey(); }
    }
}
五、删除
- 方法1
static void Dels()
{
    using (DatabaseContext _db = new DatabaseContext()) 
    {
        //1.声明实体
        Categories delcts = new Categories { CategoryId = 1 };
        //2.附件到EF中
        _db.categories.Attach(delcts);
        //3.标记为删除
        _db.categories.Remove(delcts);
        //4.执行删除的sql
        if (_db.SaveChanges() > 0) { Console.WriteLine("删除成功"); Console.ReadKey(); }
        else { Console.WriteLine("删除失败"); Console.ReadKey(); }
    }
}
- 方法2
static void Dels()
{
    using(DatabaseContext _db=new DatabaseContext())
    {
        //1.声明实体
        Categories delcts = new Categories { CategoryId = 1 };
        //2.将对象加入EF容器
        DbEntityEntry<Categories> delsEntity = _db.Entry<Categories>(delcts);
        //3.获取当前实体对象的状态管理对象对应的属性,同时标记此属性已删除状态
        delsEntity.State = EntityState.Deleted;
        //4.执行删除的操作
        if (_db.SaveChanges() > 0) { Console.WriteLine("删除成功"); Console.ReadKey(); }
        else { Console.WriteLine("删除失败"); Console.ReadKey(); }
    }
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号