赞
踩
EFCore官方文档置顶,看这个就行。下面的内容只是总结,算是备忘录。
一、创建和删除
//1、创建数据库和表
db.Database.EnsureCreated();//将创建数据库(如果不存在)并初始化数据库架构。 如果存在任何表 (包括另一 DbContext 类) 的表,则不会初始化架构。//仅在书中没有表时有效
//2、删除数据库
db.Database.EnsureDeleted//方法将删除数据库(如果存在)。 如果没有适当的权限,则会引发异常。
//3、迁移数据库
context.Database.Migrate();
//4、初始化数据库和表。可以用来创建不存在的表(已存在表,则会报错)
//EnsureCreated 仅在数据库中没有表时有效。 如果需要,可以编写自己的检查来查看架构是否需要初始化,并使用基础 IRelationalDatabaseCreator 服务初始化架构。
var databaseCreator = dbContext.GetService<IRelationalDatabaseCreator>();
databaseCreator.CreateTables();
二、表模型
[Table("Books")]//命名表名 public class Book { [Key]//主键。Id或<type name>Id将被配置为实体主键。其他属性名则需要配置[Key] [Column("book_Id")]//表的类名 public long Id { get; set; } [Column(TypeName ="varchar(200)",Order =1/*列顺序*/)] [Comment("The URL of the blog")]//列注释 public string? Title { get; set; } [Column(TypeName = "datetime2(7)")] [Precision(7)]//与"datetime2(7)"等价 public DateTime? PubTime { get; set; } [Column(TypeName = "decimal(5,2)")]//精度5,小数位2 [Precision(5, 2)]//与"decimal(5,2)"等价 public double? Price { get; set; } [MaxLength(500)]//与varchar(500)等价 public string? Author { get; set; } }
三、DbContext
public class TestDbContext : DbContext { //表格实体 public DbSet<Book> Books { get; set; } public string DbPath { get; } public TestDbContext() { string desktop=System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop); DbPath = Path.Join(desktop, "TestDB.db"); } //连接数据库字符串 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite($"Data Source={DbPath}"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Book>().Property(x => x.Price).HasDefaultValue(1.00);//列设置默认属性 modelBuilder.Entity<Book>().Property(x => x.PubTime).HasDefaultValue(DateTime.Now);//列设置默认属性 } }
四、查询。Linq表达式
//1、加载所有数据 var books = context.Books.ToList(); //2、加载单个对象 var book = context.Books.Single(b => b.Id== 1); //3、筛选 var books = context.Books .Where(b => b.Url.Contains("dotnet")) .ToList(); //4、跟踪查询。查询到的对象可以用来修改数据库中的值 var first=db.list.First(); first.Name="已修改"; context.SaveChanges(); //5、非跟踪查询。查询到的对象无法修改数据库中的值 var first=db.list.AsNoTracking().First(); first.Name="已修改"; db.SaveChanges(); //6、非跟踪查询2。与上面等效,多次操作时,可以少用几个AsNoTracking()方法 db.ChangeTracker.QueryTrackingBehavior=QueryTrackingBehavior.NoTracking; var first=db.list.First(); first.Name="已修改"; db.SaveChanges(); //7、非跟踪查询3。在连接字符串后面增加限定 protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlite($"Data Source={DbPath}").UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); //8、分组和统计 //得到的group是List<匿名类>。匿名类的属性就2个ClassId 和StudentCount var group = db.Students //使用GroupBy分组,依据ClassId .GroupBy(s => s.ClassId).Select(g => new { //拿到ClassId,由于ClassId是分组的,因此使用Max或Min是一样的 ClassId = g.Max(s => s.ClassId), //使用Count函数拿到总数 StudentCount = g.Count() });
五、删除
//1、批量删除
db.list.Where(x=>x.Id>30).ExecuteDelete();
//2、单个删除
var stu=db.list.FirstOrDefault();
db.list.Remove(stu);
int deleteCount=db.SaveChanges();
六、添加
//1、单个添加
db.Add(new Student(){ClassId=2,Name="赵子龙"});
db.SaveChanges();
//2、多个添加
db.AddRange(new List<Student>(){
new Student(){ClassId=2,Name="张翼德"}),
new Student(){ClassId=2,Name="关云长"}),
});
db.SaveChanges();
七、修改
//1、单个修改
var stu = db.list.FirstOrDefault(x => x.Name.Equals("赵子龙"));
stu.Name= "赵云";
db.Entry(stu).State = EntityState.Modified;
int editCount = db.SaveChanges();
//2、批量修改1
var stus = db.list.Where(x => x.ClassId==2);
foreach (var stu in stus)
{
stu.Name= "赵云";
db.Entry(stu).State = EntityState.Modified;
}
int editCount = db.SaveChanges();
//3、批量修改2。与上面方法效果一致
db.list.Where(x => x.ClassId==2).ExecuteUpdate(s=>s.SetProperty(b=>b.Name,"赵云"));
八、操作
//SaveChange()可以同时处理多个操作。不明确、不批量、不知道时使用该方法
//ExecuteDelete()方法会立即执行。明确、批量、知道时使用该方法
//ExecuteUpdate ()方法会立即执行。明确、批量、知道时使用该方法
九、事务
//事务允许以院子方式处理多个数据库操作。如果已提交事务,则所有操作都会成功应用到数据库。如果已回滚事务,则所有操作都不会应用到数据库。 using var transaction = db.Database.BeginTransaction(); try { //批量添加1 db.AddRange(new List<Post>() { new Post(){ PostId=3,Title="cc" }, new Post(){ PostId=3,Title="dd" }, }); db.SaveChanges(); //批量添加2 db.AddRange(new List<Post>() { new Post(){ PostId=3,Title="ee" }, new Post(){ PostId=3,Title="ff" }, }); db.SaveChanges(); //提交事务 transaction.Commit(); } catch (Exception ex)//提交事务会出现异常 { //回滚事务 transaction.Rollback(); Console.WriteLine(ex.Message); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。