EFCore常见用法

这篇具有很好参考价值的文章主要介绍了EFCore常见用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 ()方法会立即执行。明确、批量、知道时使用该方法

九、事务文章来源地址https://www.toymoban.com/news/detail-663932.html

//事务允许以院子方式处理多个数据库操作。如果已提交事务,则所有操作都会成功应用到数据库。如果已回滚事务,则所有操作都不会应用到数据库。
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);
}

到了这里,关于EFCore常见用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为openGauss数据库入门 - gsql用法

    目录 1.1 gsql的语法 1.2 gsql常用选项 1.2.1  最常用的必要选项 1.2.2 -r选项 1.2.3 -E选项 1.2.4 -t选项 1.2.5 -A选项 1.2.6 -v选项 1.2.7 -c选项 1.2.8 -f选项 1.2.9 -q选项 1.3 gsql的元命令 1.3.1 l命令 1.3.2 du命令和dg命令 1.3.3 db命令 1.3.4 dn命令 1.3.5 d命令 1.3.6 dt命令 1.3.7 di命令 1.3.8 dv命令 1.

    2024年02月15日
    浏览(37)
  • 华为openGauss高斯数据库 - gsql用法

    目录 1.1 gsql的语法 1.2 gsql常用选项 1.2.1  最常用的必要选项 1.2.2 -r选项 1.2.3 -E选项 1.2.4 -t选项 1.2.5 -A选项 1.2.6 -v选项 1.2.7 -c选项 1.2.8 -f选项 1.2.9 -q选项 1.3 gsql的元命令 1.3.1 l命令 1.3.2 du命令和dg命令 1.3.3 db命令 1.3.4 dn命令 1.3.5 d命令 1.3.6 dt命令 1.3.7 di命令 1.3.8 dv命令 1.

    2024年02月12日
    浏览(38)
  • 常见数据库介绍对比之SQL关系型数据库

    关系型数据库是一种基于关系模型的数据库,它使用表格来组织和存储数据。下面是一些常见的关系型数据库: MySQL是一种开源的关系型数据库管理系统(RDBMS),广泛用于Web应用程序和企业级解决方案。它具有高性能、可靠性和易用性的特点,支持广泛的操作系统和编程语

    2024年02月09日
    浏览(60)
  • 数据库常见的查询

    目录 一、查询的完全限定写法 二、条件查询 三、模糊查询 四、范围查询 1):between and 2):in 3):is null或者、is not null和null和!=null 五、case when 1)方式1 2)方式2 六、排序查询 七、分组查询 1)用到分组函数 2)分组查询语法 3)分组查询特点 4)例子

    2024年02月05日
    浏览(35)
  • 常见数据库介绍对比之NoSQL非关系型数据库

    常见的非关系型数据库(NoSQL)包括以下几种: MongoDB: MongoDB是最受欢迎的文档型数据库之一。它使用BSON(二进制JSON)格式存储数据,并提供灵活的数据模型和复杂的查询功能。MongoDB支持水平扩展和高可用性,并具有丰富的生态系统和工具支持。 CouchDB: CouchDB是另一个流行的

    2024年02月09日
    浏览(43)
  • mysql数据库limit的四种用法

    mysql数据库中limit子句可以被用于强制select语句返回指定的记录数。limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目;若果给定一个参数,则表示回记录行的最大

    2024年02月08日
    浏览(51)
  • 数据库基础(面试常见题)

    一、 数据库 基础 1. 数据抽象 :物理抽象、概念抽象、视图级抽象,内模式、模式、外模式 2. SQL语言 包括数据定义、数据操纵(Data Manipulation),数据控制(Data Control) 数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等 数据操纵:Select ,insert,update,delete, 数据控制:grant,revoke 3

    2024年02月09日
    浏览(78)
  • 数据库常见4种范式

    在关系型数据库中,关于 数据表设计的基本原则、规则 就称为 范式 ; 关系型数据库有六种常见范式,按照范式级别,从低到高分别是: 第一范式(1NF)、第二范式 (2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式 ); 第一

    2024年02月16日
    浏览(42)
  • 大数据之LibrA数据库常见术语(九)

     一种特殊的日志记录方法,用来记录程序执行的信息。程序员使用该信息进行纠错。另外,根据trace日志中信息的类型和内容,有经验的系统管理员或技术支持人员以及软件监控工具诊断软件常见问题。    在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数

    2024年02月08日
    浏览(44)
  • 大数据之LibrA数据库常见术语(四)

     指当某个节点出现故障时,自动切换到备节点上的过程。反之,从备节点上切换回来的过程称为Failback。    在事务ID耗尽时由AutoVacuum Worker进程自动执行的操作。FusionInsight LibrA会把事务ID记在行头,在一个事务取得一行时,通过比较行头的事务ID和事务本身的ID判断这行是否

    2024年02月08日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包