一、环境搭建
1.1 下载包
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
1.2 创建实体类Book
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFCore
{
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime PubTime { get; set; }
public double Price { get; set; }
}
}
1.3 创建配置类
1.3.1 对应数据库表
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFCore
{
public 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(20).IsRequired();
}
}
}
1.3.2 对应数据库配置
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFCore
{
public 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=.159.138.73;" +
"uid=SA;" +
"pwd=qwer1234.;" +
"database=demo1_Enviroment;" +
"TrustServerCertificate=true;"
);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 从当前程序集加载所有的IEntityTypeConfiguration
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
}
1.4 Migration
1.4.1 初始化
显示控制台
控制台输入Add-Migration Init,初始化创表语句
控制台输入Update-Database,同步数据
1.4.2 添加修改
对 person 类添加了一个属性BirthPlace
控制台输入 Add-Migration AddBirth
Update-Database同步数据
1.5 Data Annotation
新增实体类cat
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFCore
{
[Table("T_Cats")]
public class Cat
{
public long Id { get; set; }
[Required]
[MaxLength]
public string Name { get; set; }
}
}
配置类添加cat
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFCore
{
public class MyDBContext:DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Person> Persons { get; set; }
public DbSet<Cat> Cats { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer(
"server=192.159.138.73;" +
"uid=SA;" +
"pwd=qwer1234.;" +
"database=demo1_Enviroment;" +
"TrustServerCertificate=true;"
);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 从当前程序集加载所有的IEntityTypeConfiguration
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
}
Add-Migration addCat 和 Update-Database 后
二、增删改查
2.1 增
2.1.1 添加一条图书信息
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
// context 相当于逻辑上的数据库
using (MyDBContext context = new MyDBContext())
{
Book book = new Book();
book.Title = "西游记";
book.AuthorName = "吴承恩";
context.Books.Add(book);
await context.SaveChangesAsync();
}
}
}
}
2.2 查
已知有如下数据:
2.2.1 查询价格大于 80 的书籍信息
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
// context 相当于逻辑上的数据库
using (MyDBContext context = new MyDBContext())
{
IQueryable<Book> books = context.Books.Where(b => b.Price > 80);
foreach(var book in books)
{
await Console.Out.WriteLineAsync(book.Title+"__"+book.Price);
}
await context.SaveChangesAsync();
}
}
}
}
2.2.2 查询"西游记"的作者
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
// context 相当于逻辑上的数据库
using (MyDBContext context = new MyDBContext())
{
Book one = context.Books.Single(b => b.Title == "西游记");
await Console.Out.WriteLineAsync(one.AuthorName);
}
}
}
}
2.2.3 价格升序
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
// context 相当于逻辑上的数据库
using (MyDBContext context = new MyDBContext())
{
IOrderedQueryable<Book> books = context.Books.OrderBy(b=>b.Price);
foreach (Book book in books)
{
await Console.Out.WriteLineAsync(book.Title+","+book.Price);
}
}
}
}
}
2.2.4 按照作者名称分组,查询出版书籍数量以及售卖书籍最贵的价格
修改部分数据
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
// context 相当于逻辑上的数据库
using (MyDBContext context = new MyDBContext())
{
var items = context.Books
.GroupBy(b => b.AuthorName)
.Select(g => new
{
Name = g.Key,
BooksCount = g.Count(),
MaxPrice = g.Max(b => b.Price)
});
foreach(var item in items)
{
await Console.Out.WriteLineAsync($"{item.Name},{item.BooksCount},{item.MaxPrice}");
}
}
}
}
}
2.3 改
2.3.1 将西游记的作者修改为张三
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
// context 相当于逻辑上的数据库
using (MyDBContext context = new MyDBContext())
{
Book book = context.Books.Single(b=>b.Title=="西游记");
book.AuthorName = "张三";
await context.SaveChangesAsync();
}
}
}
}
2.3.2 为所有价格大于10的书籍涨10块钱
涨价前
涨价后
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
// context 相当于逻辑上的数据库
using (MyDBContext context = new MyDBContext())
{
IQueryable<Book> books = context.Books.Where(b => b.Price > 10);
foreach(var b in books)
{
b.Price = b.Price + 10;
}
await context.SaveChangesAsync();
}
}
}
}
2.4 删
2.4.1 删除编号为6的书籍
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
// context 相当于逻辑上的数据库
using (MyDBContext context = new MyDBContext())
{
Book book = context.Books.Single(b=>b.Id == 6);
context.Books.Remove(book);
await context.SaveChangesAsync();
}
}
}
}
2.5 复杂查询
2.5.1 模糊查询
查询标题中带有a的文章标题
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
using (MyDBContext context = new MyDBContext())
{
var items = context.Books.Where(
c => c.Title.Contains("a"))
.Select(c => c.Title).Distinct();
foreach(var item in items)
{
await Console.Out.WriteLineAsync(item);
}
}
}
}
}
2.5.2 截取字符串
using System.Linq;
namespace EFCore
{
public class Program
{
static async Task Main(string[] args)
{
using (MyDBContext context = new MyDBContext())
{
var items = context.Books.Select(c => new
{
Id = c.Id,
Pre = c.Title.Substring(0,2) + "...."
});
foreach(var item in items)
{
await Console.Out.WriteLineAsync(item.Id + item.Pre);
}
}
}
}
}
2.5.3 分页查询
static void PrintPage(int pageIndex,int pageSize)
{
using(MyDBContext context = new MyDBContext())
{
IQueryable<Book> books = context.Books;
var items = books.Skip((pageIndex - 1)*pageSize).Take(pageSize);
foreach(var item in items)
{
Console.WriteLine(item.Title);
}
// 总数
var count = books.LongCount();
// 页数
long pageCount = (long)Math.Ceiling(count * 1.0 / pageSize);
Console.WriteLine("总页数为"+pageCount);
}
}
每页查询3条,查询第二页
3.1 一对一
3.1.1 表结构
3.1.1.1 订单表
3.1.1.2 快递表
3.1.2 测试
一个订单对于一个快递,创建数据后依次保存
3.1.3 数据库查看
快递表
订单表
3.2 多对多
一个学生有多个老师,一个老师有多个学生
3.2.1 表结构
3.2.1.1 学生表
3.2.1.2 教师表
3.2.2 测试一
测试数据插入
using EFCore;
using System;
namespace efcore5
{
class Program
{
static void Main(string[] args)
{
using (MyDBContext context = new MyDBContext())
{
Student student1 = new Student
{
Name = "zhangsan"
};
Student student2 = new Student
{
Name = "lisis"
};
Student student3 = new Student
{
Name = "wangwu"
};
Teacher teacher1 = new Teacher
{
Name = "one"
};
Teacher teacher2 = new Teacher
{
Name = "twe"
};
Teacher teacher3 = new Teacher
{
Name = "three"
};
student1.Teachers.Add(teacher1);
student1.Teachers.Add(teacher2);
student2.Teachers.Add(teacher2);
student2.Teachers.Add(teacher3);
student3.Teachers.Add(teacher1);
student3.Teachers.Add(teacher3);
context.Teachers.Add(teacher1);
context.Teachers.Add(teacher2);
context.Teachers.Add(teacher3);
context.Stuents.Add(student1);
context.Stuents.Add(student2);
context.Stuents.Add(student3);
context.SaveChanges();
}
}
}
}
3.2.3 数据库查看
学生表
教师表
中介表
3.2.4 测试二
查询所有的老师,并列出他们的学生
using EFCore;
using Microsoft.EntityFrameworkCore;
using System;
namespace efcore5
{
class Program
{
static void Main(string[] args)
{
using (MyDBContext context = new MyDBContext())
{
var Teachers = context.Teachers.Include(t => t.Students);
foreach(var t in Teachers)
{
Console.WriteLine(t.Name);
foreach(var student in t.Students)
{
Console.WriteLine("\t" + student.Name);
}
}
}
}
}
}