一、开发环境的配置
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、在新建的项目中安装NutGet包Microsoft.EntityFrameworkCore.SqlServer
![](https://img-blog.csdnimg.cn/img_convert/e4a15c131c789d4a54aaeb215854b2d6.png)
、安装命令
Install-Package Microsoft.EntityFrameworkCore.SqlServer
![](https://img-blog.csdnimg.cn/img_convert/e552d1ac32787e5f14998c096af46804.png)
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#代码
![](https://img-blog.csdnimg.cn/img_convert/d2ad155151ee48abb0864f1f9bf221df.png)
最后执行Update-database命令那些在Migrations 文件夹中用来创建数据库表的代码才会被应用到数据库中
![](https://img-blog.csdnimg.cn/img_convert/aa77a719fd103f81bb5019f319fd0470.png)
结果最后是这样的
![](https://img-blog.csdnimg.cn/img_convert/2396e2ce1c83291e35718eb02a3ed64e.png)
二、增删改查操作
插入数据
在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();
}
}
}
}
数据库结果
![](https://img-blog.csdnimg.cn/img_convert/21817b7ee620a6f9678604fd7a0ad283.png)
在插入一部分数据,为查看数据做铺垫
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();
数据库结果
![](https://img-blog.csdnimg.cn/img_convert/00588d856ca27b935ee738652f263f6c.png)
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);
}
查询结果为
![](https://img-blog.csdnimg.cn/img_convert/0a82b85d06c0764df02c8e92cd49eabc.png)
查询就不需要 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);
}
结果
![](https://img-blog.csdnimg.cn/img_convert/717b90fcdcfbcf19a0786beaa658c8c1.png)
这里有重复的是因为我添加数据添加了两次导致的
三、修改、删除
要对数据进行修改,首先需要把要修改的数据查询出来,然后再对查询出来的对象进行操作,然后再执行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();