初识EFCore

一、开发环境的配置

1、新建一个控制台项目,在其中创建一个book实体类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFCoreTest1
{
    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; }//作者名字
    }
}

2、在新建的项目中安装NutGetMicrosoft.EntityFrameworkCore.SqlServer

  1. 、安装命令

Install-Package Microsoft.EntityFrameworkCore.SqlServer

3、创建实现了IEntityTypeConfiguration接口的实体类的配置类BookEntityConfig

  • 这个实体类的作用就是配置实体类和对应表的关系

using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFCoreTest1
{
    class BookConfig : IEntityTypeConfiguration<Book>
    {
        public void Configure(EntityTypeBuilder<Book> builder)
        {
            //
            builder.ToTable("T_Books");
            builder.Property(b => b.Title).HasMaxLength(50).IsRequired();
            builder.Property(b => b.AuthorName).HasMaxLength(50).IsRequired();
        }
    }
}

只设置了一个表名T_Books

  • 约定大于配置:

可以不用对实体类做任何的配置,它会按照约定的规则把数据库建好

这里其实可以不用建这个类

4、创建一个继承自DbContext类的MyDbContext类

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFCoreTest1
{
    class MyDbContext:DbContext
    {
        //private static ILoggerFactory loggerFactory = LoggerFactory.Create(b=>b.AddConsole());
        public DbSet<Book> Books { get; set; }
        public DbSet<Person> Persons { get; set; }

        public DbSet<Dog> Dogs { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.UseSqlServer("Server=.;Database=demo1;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;");

            //optionsBuilder.UseLoggerFactory(loggerFactory);
            /*optionsBuilder.LogTo(msg =>
            {
                if (!msg.Contains("CommandExecuting")) return;
                Console.WriteLine(msg);
            });*/
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //从当前程序集中加载所有的IEntityTypeConfiguration
            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        }
    }
}
  • OnConfiguring方法用于对程序要连接的数据库进行配置:

指定连接字符串以及连接那个数据库

optionsBuilder.UseSqlServer("Server=.;Database=demo1;Trusted_Connection=True;MultipleActiveResultSets=true;Encrypt=True;TrustServerCertificate=True;");
  • OnModelCreating方法:配置类所在的程序集

modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);

5、生成数据库

  • 通过NuGet为项目安装Microsoft.EnityFrameworkCore.Tools包,这是为了使用EF Core生成数据库工具

Install-Package Microsoft.EnityFrameworkCore.Tools
  • 然后在执行Add-Migration命令会自动在项目的Migrations文件夹中生成C#代码

  • 最后执行Update-database命令那些在Migrations 文件夹中用来创建数据库表的代码才会被应用到数据库中

结果最后是这样的

二、增删改查操作

  1. 插入数据

在program中操作

using Microsoft.EntityFrameworkCore;
using System.Linq;
namespace EFCoreTest1
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            //创建逻辑上的数据库
            using (MyDbContext myDbContext = new MyDbContext())
            {
               Dog d = new Dog();
               d.Name = "Trump";
               myDbContext.Dogs.Add(d);
                //相当于update-Datebase 异步保存
                await myDbContext.SaveChangesAsync();                                   
            }
        }
    }
}

数据库结果

在插入一部分数据,为查看数据做铺垫

Book b1 = new Book
                {
                    AuthorName = "杨中科",
                    Title = "零基础学C语音",
                    Price = 59.8,
                    PubTime = new DateTime(2019, 3, 1)
                };
                Book b2 = new Book
                {
                    AuthorName = "Robert Sedgewick",
                    Title = "算法(第四版)",
                    Price = 99,
                    PubTime = new DateTime(2012, 10, 1)
                };
                Book b3 = new Book
                {
                    AuthorName = "吴军",
                    Title = "数学之美",
                    Price = 69,
                    PubTime = new DateTime(2020, 5, 1)
                };
                Book b4 = new Book
                {
                    AuthorName = "杨中科",
                    Title = "程序员的SQL金典",
                    Price = 52,
                    PubTime = new DateTime(2008, 9, 1)
                };
                Book b5 = new Book
                {
                    AuthorName = "吴军",
                    Title = "文明之光",
                    Price = 246,
                    PubTime = new DateTime(2017, 3, 1)
                };
                //把对象加入逻辑上的表上面
                myDbContext.Books.Add(b1);
                myDbContext.Books.Add(b2);
                myDbContext.Books.Add(b3);
                myDbContext.Books.Add(b4);
                myDbContext.Books.Add(b5);
                //相当于update-Datebase 异步保存
                await myDbContext.SaveChangesAsync();   

数据库结果

2、查询数据

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

2、ctx.Books.Wkere(b => b.Price > 80)

Book b1 = ctx.Books.Single(b => b.Title== "零基础趣学C语言");

Book b2 = ctx.Books.FirstOrDefault(b=>b.Id==9);

3、可以使用OrderBy操作进行数据的排序

IEnumerable <Book> books =ctx. Books. OrderByDescending(b => b.Price);

  • 查询语句

IQueryable<Book> books = myDbContext.Books.Where(b => b.Price > 80);
                foreach(var book in books)
                {
                    Console.WriteLine(book.Title);
                }

也可以写成

var books = myDbContext.Books.Where(b => b.Price > 80);
                foreach(var book in books)
                {
                    Console.WriteLine(book.Title);
                }

查询结果为

查询就不需要 await myDbContext.SaveChangesAsync();

  • 查询单个

var Book = myDbContext.Books.Single(b => b.Title == "零基础学C语言");
                Console.WriteLine(Book.AuthorName);
  • 按照价格排序

var books = myDbContext.Books.OrderBy(b => b.Price).Where(b=>b.Price>60);
                foreach(var book in books)
                {
                    Console.WriteLine(book.Title+","+book.Price);
                }
  • 结果

这里有重复的是因为我添加数据添加了两次导致的

三、修改、删除

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

                var b = myDbContext.Books.Single(b => b.Title == "数学之美");
                b.AuthorName = "junwu";

                Dog dog = myDbContext.Dogs.Single(b => b.Id == 2);

                myDbContext.Dogs.Remove(dog);
                await myDbContext.SaveChangesAsync();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值