Loading

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(); }
    }
}

posted @ 2019-09-12 16:02  我是小柒  阅读(323)  评论(0编辑  收藏  举报