Entity Framework 学习系列(4) - EF 增删改

目录

  • 写在前面
  • 一、开发环境
  • 二、创建项目
  • 三、新增
    • 1.单表新增
    • 2.批量新增
    • 3.多表新增
  • 四、编辑
    • 1.先查询,后编辑
    • 2.创建实体,后编辑
  • 五、删除

写在前面


在上一小节中,学习了如何 通过Code First + MySql 的方式实现数据的迁移。

这一下节中,总结 EF的增删改。

一、开发环境


  • 开发工具:Visual Studio 2019

  • 开发环境:Win 10 家庭版

  • 数据库:MySQL 8.0.17

二、创建项目


1.打开Visual Studio 2019 新建->创建程序台应用

Entity Framework 学习系列(4) - EF 增删改_第1张图片

2.安装 MySQL.Data 6.10.9

  • 工具->NuGet包管理器->管理解决方案的NuGet程序包->浏览

Entity Framework 学习系列(4) - EF 增删改_第2张图片

3.安装 MySQL.Data.Entity 6.10.9

  • 工具->NuGet包管理器->管理解决方案的NuGet程序包->浏览

Entity Framework 学习系列(4) - EF 增删改_第3张图片

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 { get; set; }
        public DbSet categories { get; set; }
        public DbSet shippers { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Conventions.Remove();//移除复数表名的契约
        }
    }
}

6.打开App.config修改连接字符串



    
        

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 sp=_db.Entry(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 entity = _db.Entry(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 EdEntity = _db.Entry(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 delsEntity = _db.Entry(delcts);
        //3.获取当前实体对象的状态管理对象对应的属性,同时标记此属性已删除状态
        delsEntity.State = EntityState.Deleted;
        //4.执行删除的操作
        if (_db.SaveChanges() > 0) { Console.WriteLine("删除成功"); Console.ReadKey(); }
        else { Console.WriteLine("删除失败"); Console.ReadKey(); }
    }
}

你可能感兴趣的:(Entity Framework 学习系列(4) - EF 增删改)