Entity Framework 学习系列 - EF 增删改

Posted zengjialin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Entity Framework 学习系列 - 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(); 
    

以上是关于Entity Framework 学习系列 - EF 增删改的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 开发系列 目录

Entity Framework 杂记

《Entity Framework 6 Recipes》翻译系列 -----第一章 开始使用实体框架之历史和框架简述 (转)

Entity Framework系列教程汇总

《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集 (转)

Entity Framework技巧系列之八 - Tip 29 – 34