当前位置: 首页 > article >正文

EF Core配置及使用

Entity Framework Core是微软官方的ORM框架。

ORM:Object Relational Mapping。让开发者用对象操作的形式操作关系数据库。

EF Core是对于底层ADO.NET Core的封装,因此ADO.NET Core支持的数据库不一定被EF Core支持。

代码创建数据库Code First

建实体类,建DbContext,生成数据库

建实体类:Book.cs

public class Book
{
    public long Id { get; set; }//主键
    public string Title { get; set; }//标题
    public DateTime PubTime { get; set; }//发布日期
    public double Price { get; set; }//单价
    public string AuthorName { get; set; }//作者
}

NuGet安装:Install-Package Microsoft.EntityFrameworkCore.SqlServer

创建实体配置类BookConfig.cs

 创建实现了IEntityTypeConfiguration接口的实体配置类,配置实体类和数据库表的对应关系。

class BookConfig : IEntityTypeConfiguration<Book>
{
    public void Configure(EntityTypeBuilder<Book> builder)
    {
        //将实体类Book映射到的数据库表名为T_Books
        builder.ToTable("T_Books");
        //自定义表结构       
        builder.Property(b=>b.Title).HasMaxLength(50).IsRequired();
        builder.Property(b=>b.AuthorName).HasMaxLength(20).IsRequired();

    }
}

创建继承DbContext的类MyDbContext

class MyDbContext:DbContext
{
    public DbSet<Book> Books { get; set; }
    public DbSet<Person> Persons { get; set; }
    //配置数据库连接
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
        optionsBuilder.UseSqlServer("Server=.;Database=demo;Trusted_Connection=true;MultipleActiveResultSets=true;TrustServerCertificate=true;");
    }

    //配置实体模型
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //允许你在模型被映射到数据库之前对其进行自定义配置
        base.OnModelCreating(modelBuilder);
        //从当前程序集加载所有的IEntityTypeConfiguration
        modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
    }
}

Migration数据库迁移

  • 面向对象的ORM开发中,数据库不是程序员手动创建的,而是由Migration工具生成的。关系数据库只是盛放模型数据的一个媒介而已,理想状态下,程序员不用关心数据库的操作。
  • 根据对象的定义变化,自动更新数据库中的表以及表结构的操作,叫做Migration(迁移)。
  • 迁移可以分为多步(项目进化),也可以回滚。

  1. NuGet安装:Microsoft.EntityframeworkCore.Design;
                         Microsoft.EntityFrameworkCore.Tools,否则执行Add-Migration等命令会报错
  2. 在“程序包管理器控制台”中执行Add-Migration Init(init为迁移名称)
  3. 执行Update-Database,应用对数据库进行操作

增删查改

新增

只要操作Books属性,就可以向数据库中增加数据,但是通过C#代码修改Books中的数据只是修改了内存中的数据。对Books做修改后,需要调用DbContext的异步方法SaveChangesAsync()把修改保存到数据库。也有同步的保存方法SaveChanges(),但是用EF Core都推荐用异步方法,EF Core默认会跟踪(Track)实体类对象以及DbSet的改变。

static async Task Main(string[] args)
{
    //ctx=逻辑上的数据库
    using (MyDbContext ctx = new MyDbContext())
    {
        Book b = new Book()
        {
            Title = "软件工程",
            PubTime = DateTime.Now,
            Price = 36.8,
            AuthorName = "ljy"
        };
        ctx.Add(b);//把d对象加入到Dogs这个逻辑上的表里面
        await ctx.SaveChangesAsync();//相当于Update-Database,调用异步方法添加
    }
}

查询

DbSet实现了IEnumerable<T>接口,因此可以对DbSet实施Linq操作来进行数据查询。EF Core会把Linq操作转换为SQL语句。面向对象,而不是面向数据库(SQL),大部分Linq操作都能作用于EF Core。

static async Task Main(string[] args)
{
    //ctx=逻辑上的数据库
    using (MyDbContext ctx = new MyDbContext())
    {
        //查询Books表中价格大于80的书籍名称
        //相当于select * from t_books where price >80
        IQueryable<Book> books = ctx.Books.Where(b => b.Price > 80);
        foreach (Book book in books)
        {
            Console.WriteLine(book.Title);
        }
    }
}

修改

要对数据进行修改,首先需要把要修改的数据查询出来,然后再对查询出来的对象进行修改,然后再执行SaveChangesAsync()保存修改。

static async Task Main(string[] args)
{
    using (MyDbContext ctx = new MyDbContext())
    {
        //相当于update t_books set AuthorName='ljy' where title='操作系统'
        Book books = ctx.Books.SingleOrDefault(b => b.Title == "操作系统");
        books.AuthorName = "ljy";
        await ctx.SaveChangesAsync();
    }
}

删除

删除也是先把要修改的数据查询出来,然后再调用DbSet或者DbContext的Remove方法把对象删除,然后再执行SaveChangesAsync()保存修改。

static async Task Main(string[] args)
{
    using (MyDbContext ctx = new MyDbContext())
    {
        //相当于delete t_books where title='操作系统'
        Book books = ctx.Books.SingleOrDefault(b => b.Title == "操作系统");
        ctx.Remove(books);
        await ctx.SaveChangesAsync();
    }
}

EF Core7.0批量修改删除

批量修改:ExecuteUpdate()

//Linq
context.Blogs
    .Where(b => b.Rating < 3)
    .ExecuteUpdate(setters => setters
        .SetProperty(b => b.Title, Dog)//将Title设置为Dog
        .SetProperty(b => b.Rating, 0));//将Rating设置为0

//SQL
update Blogs set Blogs.Rating=0,Blogs.Title=Dog From Blogs where Blogs.Rating<3

批量删除:ExecuteDelete()

//Linq
context.Blogs.Where(b => b.Rating < 3).ExecuteDelete();

//SQL
delete from Blogs where Blogs.Rating<3


http://www.kler.cn/a/468252.html

相关文章:

  • 十四、Vue 混入(Mixins)详解
  • 产品经理-竞品分析
  • OSPF - 影响OSPF邻居建立的因素
  • springboot550乐乐农产品销售系统(论文+源码)_kaic
  • JavaScript系列(8)-- Array高级操作
  • 在线二维码生成器-GO在线工具-文本工具
  • Tailwind CSS 实战:响应式导航栏设计与实现
  • asp.net core Web Api中的数据绑定
  • STM32F103 MCU 上电启动流程分析实现
  • 从 TiDB 学习分布式数据库测试
  • 构建JS全栈开发的CMS系统——从零开始搭建前后端
  • kafka使用常见问题
  • 【机器学习篇】交通革命:机器学习如何引领未来的道路创新
  • 仓颉笔记——windows11安装启用cangjie语言,并使用vscode编写“你好,世界”
  • 面试经典150题——矩阵
  • 《数据结构》期末考试测试题【中】
  • 在PostgreSQL中,函数调用是一个非常重要的操作
  • deepseek v3模型为啥要开源
  • Eplan 项目结构(高层代号、安装地点、位置代号)
  • 初识C语言之函数的递归
  • 【linux基础I/O(1)】文件描述符的本质重定向的本质
  • 解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。
  • SQL Server 的备份机制及其恢复实现
  • 利用轮换IP的强大功能
  • CSS系列(49)-- Relative Color Syntax详解
  • Postgresql中clog与xid对应关系计算方法(速查表)