自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(99)
  • 收藏
  • 关注

原创 C#新语法

C#中的==运算符默认是判断两个变量指向的是否是同一个对象,即使两个对象内容完全一样,也不相等。在实现了Idisposable/IAsyncDisposable接口的类型的变量声明前加上using,当代码执行离开变量的作用域时,对象就会被释放。如果程序员确认被访问的变量、成员确实不会出现为空的情况,也可以在访问可空的变量、成员的时候加上!来抑制编译器的警告。在之前版本的C#中,类型必须定义在namespace中。两种,值类型的变量不可以为空,而引用类型变量可以为空。

2025-01-24 02:13:53 1141

原创 EF Core表达式树

表达式树(Expression Tree):树形数据结构表示代码,以表示逻辑运算,以便可以在运行时访问逻辑运算的结构。Expression<TDelegate>类型从Lambda表达式来生成表达式树:Expression<Func<Book, bool>> e1 = b =>b.Price > 5;

2025-01-23 00:51:57 389

原创 EF Core 乐观、悲观并发控制

乐观并发控制能够避免悲观锁带来的性能、死锁等问题,因此推荐使用乐观并发控制而不是悲观锁。如果有一个确定的字段要被进行并发控制,那么使用IsConcurrencyToken()把这个字段设置为并发令牌即可;如果无法确定一个唯一的并发令牌列,那么就可以引入一个额外的属性设置为并发令牌,并且在每次更新数据的时候,手动更新这一列的值。如果用的是SQLServer数据库,那么也可以采用RowVersion列,这样就不用开发者手动来在每次更新数据的时候,手动更新并发令牌的值了。

2025-01-22 16:07:53 1570

原创 EF Core全局查询筛选器

全局查询筛选器:EFCore会自动将这个查询筛选器应用于涉及这个实体类型的所有LINQ查询。场景:软删除、多租户。什么是软删除?逻辑删除,并不是真正地从数据库中把记录删除,而是通过特定的标记方式在查询的时候将此记录过滤掉。虽然数据在界面上已经看不见,但是数据库还是存在的。

2025-01-17 23:36:40 525

原创 EF Core批量处理

使用这个开发包,EntityFrameworkCore用户可以使用LINQ语句删除或者更新多条数据库记录,操作只执行一条SQL语句并且不需要首先把实体对象加载到内存中。原生SQL语句需要把表名、列名等硬编码到SQL语句中,不符合模型驱动、分层隔离等思想,程序员直接面对数据库表,无法利用EFCore强类型的特性,如果模型发生改变,必须手动变更SQL语句。NuGet安装:Install-PackageZack.EFCore.Batch.MSSQL_NET8。以.NET9+SQLServer为例。

2025-01-17 15:18:30 864

原创 EF Core实体跟踪

EntityEntry类的State属性代表实体的状态,通过DebugView.LongView属性可以看到实体的变化信息。DbContext会根据跟踪的实体的状态,在SaveChanges()的时候,根据实体状态的不同,生成Update、Delete、Insert等SQL语句,来把内存中实体的变化更新到数据库中。快照更改跟踪:首次跟踪一个实体的时候,EF Core 会创建这个实体的快照。执行SaveChanges()等方法时,EF Core将会把存储的快照中的值与实体的当前值进行比较。

2025-01-16 23:14:10 865

原创 EF Core执行原生SQL语句

一般Linq操作就够了,尽量不用写原生SQL;非查询SQL用ExecuteSqlInterpolated ();针对实体的SQL查询用FromSqlInterpolated()。复杂SQL查询用ADO.NET的方式或者Dapper等。

2025-01-15 23:12:08 1545

原创 EF Core中的异步方法

IQueryable的这些异步的扩展方法都是“立即执行”方法,而GroupBy、OrderBy、Join、Where等“非立即执行”方法则没有对应的异步方法。“非立即执行”方法并没有实际执行SQL语句,并不是消耗IO的操作。

2025-01-15 14:43:29 523

原创 IQueryable是一次性把数据都加载到内存吗

用insert into select多插入一些数据,然后加上Delay/Sleep的遍历IQueryable。在遍历执行的过程中,停止SQLServer服务器。一次性加载数据到内存:用IQueryable的ToArray()、ToArrayAsync()、ToList()、ToListAsync()等方法。DataTable:把所有数据都一次性从数据库服务器都加载到客户端内存中。内存占用大,节省DB连接。等ToArray()执行完毕,再断服务器,不受影响。缺点:如果处理的慢,会长时间占用连接。

2025-01-15 00:32:39 399

原创 EF Core分页

【代码】EF Core分页。

2025-01-14 23:27:46 292

原创 IEnumerable和IQueryable

普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句(服务器端评估)。对普通集合和DbSet调用的Where方法,虽然用起来一样,但是“转到定义”后看到的是不同的方法。IEnumerable适用于一些需要对数据库数据进行复杂操作的场景,可以减轻数据库压力。IQueryable接口是继承自IEnumerable的接口的。IQueryable是一个待查询的逻辑,因此它是可以被重复使用的。

2025-01-14 03:48:50 953

原创 EF Core一对一和多对多

必须显式的在其中一个实体类中声明一个外键属性,可以在Order建立Delivery,也可以在Delivery建立OrderId。EF Core5.0开始,才正式支持多对多。

2025-01-13 23:36:43 646

原创 EF Core自引用的组织结构树

【代码】EF Core自引用的组织结构树。

2025-01-13 00:40:15 162

原创 双向导航和单向导航

系统里的一些基础表,经常被非常多的表引用,例如下图,User被5个表引用,双向导航的话,User要添加5个属性,而单向引用的话就不需要在User表进行操作,只需在请假表中找到User即可。而对于其他的“一对多”表关系:如果表属于被很多表引用的基础表,则用单项导航属性,否则可以自由决定是否用双向导航属性。在Leave类中,由于有两个User属性,系统提示可能会导致循环或多重级联路径。与双向导航配置类似,在配置的时候WithMany()不设置参数即可。对于主从结构的“一对多”表关系,一般是声明双向导航属性。

2025-01-09 23:11:20 436 1

原创 EF Core一对多关系配置

FluentAPI关系配置;多对多:HasMany (…).WithMany(…一对多:HasOne(…).WithMany(…一对一:HasOne(…).WithOne (…XXX可选值One、Many。有XXX、反之带有XXX。

2025-01-09 02:05:10 512

原创 同样的LINQ被翻译为不同的SQL语句

同样的C#语句在不同数据库中被EF Core翻译成不同的SQL语句。

2025-01-09 00:50:44 364

原创 通过代码查看EF Core的SQL语句

写测试性代码,用简单日志;正式需要记录SQL给审核人员或者排查故障,用标准日志;开发阶段,从繁杂的查询操作中立即看到SQL,用ToQueryString()。

2025-01-08 21:28:40 528

原创 结构化日志和集中日志服务

普通项目用NLog输出到文本文件即可,根据需要设定过滤、分类规则。集群部署的项目用Serilog+“集中式日志服务”。如果需要记录结构化日志,再进行结构化输出。如果用云服务的就够了,就用云服务的,免得自己部署;如果想自己控制日志数据就用自部署Exceptionless或者ELK(难度大)等。

2025-01-08 21:04:51 879

原创 日志系统和NLog

日志输出时,会从上往下匹配rules节点下所有的logger,若发现当前日志的分类名符合这个logger的name的通配符,就会把日志输出给这个logger。需要记录日志的代码,注入ILogger即可,T一般就用当前类,这个类的名字会输出到日志,方便定位错误。.NET的日志非常灵活,对于业务代码只要注入日志对象记录即可,具体哪些日志输出到哪里、什么样的格式、是否输出等都有配置或者初始化代码决定。为了避免冲突,如果用NLog,建议不要再配置.NET 的分级等(具体用法见微软文档)。

2025-01-08 14:07:25 665

原创 深入研究Migrations

使用迁移脚本,可以对当前连接的数据库执行编号更高的迁移,这个操作叫做“向上迁移”(Up),也可以执行把数据库回退到旧的迁移,这个操作叫“向下迁移”(Down)。查看数据库的__EFMigrationsHistory表:记录当前数据库曾经应用过的迁移脚本,按顺序排列。生成的实体类可能不能满足项目的要求,可能需要手工修改或者增加配置。除非有特殊需要,否则不要删除Migrations文件夹下的代码。把数据库更新到XXX的状态,迁移脚本不动。删除最后一次的迁移脚本。生成可迁移的SQL脚本。

2025-01-07 01:28:37 339

原创 EF Core 主键

有的数据库支持部分的连续Guid,比如SQLServer中的NewSequentialId(),但也不能解决问题。在MySQL中,插入频繁的表不要用Guid做主键。主键值由两部分组成:高位(Hi)和低位(Lo),高位由数据库生成,两个高位之间间隔若干个值,由程序在本地生成低位,低位的值在本地自增生成。不同进程或者集群中不同服务器获取的Hi值不会重复,而本地进程计算的Lo则可以保证可以在本地高效率的生成主键值。不仅保证了性能,而且利用了Guid的优点,而且减轻了主键自增性导致主键值可被预测带来的安全性问题。

2025-01-06 22:46:09 593

原创 .NET Core FluentAPI

推荐使用HasIndex(b=>b.Number)、Property(b => b.Number)这样的写法,因为这样利用的是C#的强类型检查机制。Fluent API中很多方法都有多个重载方法。比如HasIndex、Property()。把配置以特性(Annotation)的形式标注在实体类中。把配置写到单独的配置类中。

2025-01-06 21:28:54 1376

原创 IEnumerable和IQueryable

普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句(服务器端评估)。对普通集合和DbSet调用的Where方法,虽然用起来一样,但是“转到定义”后看到的是不同的方法。IEnumerable适用于一些需要对数据库数据进行复杂操作的场景,可以减轻数据库压力。IQueryable是一个待查询的逻辑,因此它是可以被重复使用的。

2025-01-05 13:05:50 769

原创 EF Core配置进行增删查改以及Migration数据库迁移

Entity Framework Core是微软官方的ORM框架。让开发者用对象操作的形式操作关系数据库。EF Core是对于底层ADO.NET Core的封装,因此ADO.NET Core支持的数据库不一定被EF Core支持。

2025-01-04 22:51:31 757

原创 .Net Core配置系统

无参数版本会把程序相关的所有环境变量都加载进来,由于有可能和系统中已有的环境变量冲突,因此建议用有prefix参数的AddEnvironmentVariables()。读取配置的时候,prefix参数会被忽略。对于环境变量、命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行“扁平化处理”。对于数组这样配置:a:b:c:0、a:b:c:1、a:b:c:2。按照注册到ConfigurationBuilder的顺序,后注册的优先级高,如果配置名字重复,用后注册的值。

2024-12-29 01:55:50 898

原创 依赖注入(一)

依赖注入(DI)是思想的实现方式,依赖注入简化模块的组装过程,降低模块之间的耦合度代码控制反转的目的:怎样创建xx对象→我要xx对象。

2024-11-25 10:29:22 763

原创 LINQ(三)

使用Where、OrderBy、Select等 扩展方法进行数据查询的写法叫做“LINQ方法语法”。计算用逗号分隔的字符串平均成绩,"61,90,100,99,18,22,38,66,80,93,55,50,89"统计一个字符串中每个字母出现的频率(忽略大小写),按照从高到低的顺序输出出现频率高于2次的字母和其出现的频率。ToArray()和ToList()可以把IEnumerable转换为数组类型和List类型。运行时没有区别,编译后都是一样的,.NET开发者大部分还是用“方法语法”

2024-09-08 19:59:29 312

原创 LINQ(二)常用扩展方法

IGrouping是一个继承自IEnumerable的接口,IGrouping中Key属性表示这组的分组数据的值。LINQ中所有的扩展方法几乎都是针对IEnumerable接口的,几乎所有能返回集合的都返回IEnumerable,所以是可以把几乎所有方法“链式使用”的。:每一项数据都会经过predicate的测试,如果针对一个元素,predicate执行的返回值为true,那么这个元素就会放到返回值中。如果序列中不包含任何元素,则返回默认值,其中int类型的默认值是0,string类型的默认值是空。

2024-09-05 11:17:53 364

原创 LINQ(一)

D1 d = F1;d();d = F2;d();//Action举例:无参无返回值A();//Func举例:传入两个int,返回int//Func举例:传入两个int,返回string//Action举例:传入两个intConsole.WriteLine("我是F1");Console.WriteLine("我是F2");输出结果为:我是F1我是F23我是F15xxx。

2024-09-04 10:53:22 311

原创 异步编程(三)

Web开发中,网页处理时间较长时,用户关闭浏览器或访问其他网页时,如果该网页的请求在服务器端没有完成,则服务器会自动终止访问请求,以此来节省服务器资源。ASP.NET Core开发中,一般不需要自己处理CancellationToken、CancellationTokenSource,只要做到“Task.WhenAll(Task[]):所有Task完成,Task才完成。Task.WhenAny(Task[]):任何一个Task完成,Task就完成。有时需要提前终止任务,比如:请求超时、用户取消请求。

2024-07-29 16:11:18 504

原创 你的连接不是专用连接

在学习.net core的过程中,运行后进不去浏览器显示“你的连接不是专用连接”点击网页空白处,输入thisisunsafe,即可正常访问网页。

2024-07-28 21:43:06 668

原创 异步编程(二)

如果想在异步方法中暂停一段时间,不要用Thread.Sleep(),因为它会阻塞调用线程,而要用await Task.Delay()异步方法的代码并不会自动在新线程中执行,除非把代码放到新线程中执行。Thread.Sleep():同步延迟,会阻塞线程,不能取消。Task.Delay():异步延迟,不会阻塞线程,可以取消。

2024-07-27 17:48:06 267

原创 异步编程(一)

异步方法、异步方法编写、.NET6中Main方法的生成、async背后的线程切换、接口中的异步方法、异步与yield

2024-07-24 17:23:54 368

原创 Java基础笔记(17):异常处理

一般地,用户自定义异常类都是的子类自定义异常类通常需要编写几个重载的构造器自定义异常需要提供自定义的异常通过throw抛出自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。

2023-01-03 16:40:00 374

原创 C#文件操作

(5)Truncate:打开已经存在的文件,并清除文件中的内容,保留文件的创建日期。如果文件不存在,则会抛出异常。(6)Append:打开文件,用于向文件中追加内容,如果文件不存在,则创建一个新文件。(4)OpenOrCreate:打开已经存在的文件,如果文件不存在,则创建文件。(2)Create:创建文件,如果文件不存在,则删除原来的文件,重新创建文件。(1)CreateNew:创建新文件,如果文件已经存在,则会抛出异常。(3)Open:打开已经存在的文件,如果文件不存在,则会抛出异常。

2022-12-28 13:49:22 1447

原创 Java基础笔记(16)内部类

在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。内部类一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。

2022-12-28 09:03:29 184

原创 Java基础笔记(15)代理模式

可以做到在不修改目标对象的功能前提下,对目标功能扩展因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.

2022-12-26 20:42:41 156

原创 Java基础笔记(14)抽象类和接口

抽象类抽象方法不能用abstract修饰变量、代码块、构造器。不能用abstract修饰私有方法、静态方法、final的方法、final的类。

2022-12-26 17:20:43 150

原创 Java基础笔记(13)static和final

对Java类或对象进行初始化一个类中代码块若有修饰符,则只能被static修饰,称为静态代码块(static block),没有使用static修饰的,为非静态代码块。static代码块通常用于初始化static的属性。

2022-12-08 13:41:19 328

原创 Java基础笔记(12)单例设计模式

当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能。如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的。以返回类内部创建的对象, 静态方法只能访问类中的静态成员变量,所以,指向类内部产生的。单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类。

2022-12-06 17:29:46 170

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除