C#新语法
顶级语句1、直接在C#文件中直接编写入口方法的代码,不用类,不用Main。经典写法仍然支持。2、同一个项目中只能有一个文件具有顶级语句。3、顶级语句中可以直接使用await语法,也可以声明函数。
12345678910Console.WriteLine("Hello, World!");string res = await File.ReadAllTextAsync("d:/1.txt");test1();test2();static void test1() { Console.WriteLine(1);}void test2() { Console.WriteLine(2);}
全局using指令1、将global修饰符添加到using前,这个命名空间就应用到整个项目,不用重复using。2、通常穿件一个专门用来编写全局using代码的C#文件。3、如果csproj中启用了<ImplicitUsings>enable</ImplicitUsings>,编译 ...
停更一段时间
亲爱的小伙伴们,今天是冬至啦,不知道大家有没有吃饺子。由于本人面临期末考试和毕业设计等原因,技术博客不得不暂停更新一段时间,具体需要多久还不太清楚大概率年后会进行大量的更新,不过有一点可以肯定的是,我尽量在一月份的时候将之前EFCore和ASP.Net Core的坑填完,目前还有:
文章
进度
Asp.Net Core_SignalR
未写完
在这里想先给自己留几个坑等日后填上,之后打算做一点偏物联网和工控的内容,会涉及到Python、SQLite、modbus、mqtt、Linux之类的,我会一点一点将我学到的东西记录下来,在这里先开几个坑:
科目
内容
Python
基本语法、多线程、File、操作数据库、网络编程
SQLite
数据库基本操作、索引、事务、锁等
Linux
Linux基本使用,借鉴韩顺平老师Linux教程
之前的Asp.Net Core教学只涉及到Web Api,并没有用到MVC。我对MVC了解不多,要是工作不忙的话,我会从头翻一遍文档,尽量把文档中比较难理解的地方转成大白话来写几篇文章。
祝各位前程似锦!
EFCore_表达式树
什么是表达式树在之前的章节中,我们用委托的形式生成了SQL语句,但是这个生成SQL语句的过程是怎么进行的呢?在编译原理这门课中会讲到表达式树:将一个表达式比如b.Price>5,转为一个树,这棵树的根节点是大于号,左节点是成员访问符,右节点是5,根节点的左节点的左节点是b,根节点的左节点的右节点是Price,EFCore可以通过遍历这样的表达式树生成对应的SQL语句。
表达式树(Expression)和委托的不同我们用Expression<TDelegate>类型表示表达式树,具体代码如下:
123456789static void Main(string[] args) { Expression<Func<Article, bool>> e1 = a => a.Id > 5; //Expression<Func<Article,bool>> f2= a => { a.Id < 3};注意,这样的写法不被允许,因为在语句体写法中可能夹杂其他语句导致无法翻译 ...
EFCore_并发控制
并发控制概念避免多个用户同时操作资源造成的并发冲突问题。最好的解决方案:非数据库解决方案数据库层面的两种策略:悲观、乐观。
悲观并发控制1、悲观并发控制一般采用行锁、表锁等排他锁对资源进行锁定,确保同时只有一个使用者操作被锁定的资源。2、EF Core没有封装悲观并发控制的的使用,需要编写原生SQL语句来使用悲观并发控制。不同数据库的语法不一样。
方案1、实体类
12345class House{ public long Id {get;set;} public string Name {get;set;} public string Owner {get;set;}}
2、MySql方案:
1select * from T_Houses where Id=1 for update
如果有其他的查询操作也使用for update来查询Id=1的数据的话,那些查询会被挂起,一直到针对这条数据的更新操作完成从而释放这个行锁,代码才会继续执行。3、事务:锁是和事务相关的,因此通过BeginTransac ...
EFCore_全局查询筛选器
全局查询筛选器全局查询筛选器:EF Core会自动将这个查询筛选器应用于涉及这个实体类型的所有LINQ查询。场景:软删除、多租户。
用法向配置类添加builder.HasQueryFilter(b=>b.IsDeleted==false);
12345678public class ArticleConfig : IEntityTypeConfiguration<Article>{ public void Configure(EntityTypeBuilder<Article> builder) { builder.ToTable("T_Articles"); builder.HasQueryFilter(a => a.IsDeleted==false); }}
忽略全局筛选器ctx.Articles.IgnoreQueryFilters();
12345678910static void Main(string[] ...
EFCore_实体数据的状态
实体状态快照更改跟踪首次跟踪一个实体的时候,EF Core会创建这个实体的快照。执行SaveChanges()等方法时,EF Core将会把存储在快照中的值与实体的当前值进行比较。和DbContext有关系的实体、类都会生成快照。
实体的状态已添加(Added):DbContext正在跟踪此实体,但数据库中尚不存在该实体。未改变(Unchanged):DbContext正在跟踪此实体,该实体存在于数据库中,其属性值和从数据库中读取到的值一致,未发生改变。已修改(Modified):DbContext正在跟踪此实体,并存在于数据库中,并且其部分或全部属性值已修改。已删除(Deleted):DbContext正在跟踪此实体,并存在于数据库中,但在下次调用SaveChanges时要从数据库中删除对应数据。已分离(Detached):DbContext未跟踪该实体。
查询实体状态使用DbContext的Entry()方法来获取实体在EF Core的跟踪信息对象EntityEntry。EntityEntry类的State属性代表实体的状态,通过DebugView.LongView属性可以看到实体 ...
EFCore_原生SQL语句
执行原生非查询SQL语句可以自己写数据库语句而非使用linq进行转换。由于数据库语法的差异,所以可能无法跨越数据库使用。一般用于以下情况:非查询语句、实体查询、任意SQL查询。
简单使用使用dbCtx.Database.ExecuteSqlInterpolated()、dbCtx.Database.ExecuteSqlInterpolatedAsync()执行原生的非查询SQL语句。
123456static async Task Main(string[] args) { using(var ctx = new MyDbContext()) { await ctx.Database.ExecuteSqlInterpolatedAsync(@$"INSERT INTO t_articles (Title, Message) VALUES ('WBG对战T1', 'WBG与T1将于11月19日下午四点进行比赛');"); ...
EFCore_IQueryable
IQueryable与IEnumerable不同的Where方法1、对于普通集合和DbSet调用的Where方法,虽然用起来一样,但是“转到定义”后看到的是不同的方法。2、普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句(服务器端评估)。如果强制使用IEnumerable的版本,两个方式会生成不同的SQL语句。Program.cs:
1234567891011 static void Main(string[] args) { using (var ctx = new MyDbContext()) { //IQueryable<Comment> comments = ctx.Comments; //IQueryable<Comment> cmts = comments.Where(c => c.Message.Contains("人性")); IEnume ...
EFCore_一对一与多对多
一对一采购申请订单——>采购订单订单——>快递单我将以订单——>快递单为例进行讲解。一对一关系必须显示地在其中一个实体类中声明一个外键属性。实体类:
123456789101112public class Delivery { public long Id { get; set; } public string CampanyName { get; set; } public string Number { get; set; } public Order Order { get; set; } public long OrderId { get; set; }//显式建立外键}public class Order { public long Id { get; set; } public string Name { get; set; } public ...
EFCore_一对多
EF Core一对多步骤1、实体类中关系属性2、FluentAPI关系配置3、使用关系操作
演示目的:数据库保存文章与评论,一篇文章对应多条评论1、实体类中关系属性
123456789101112public class Article { public int Id { get; set; } public string Title { get; set; } public string Message { get; set; } public List<Comment> Comments = new List<Comment> ();//实体类中关系属性}public class Comment { public int Id { get; set; } public string Message { get; set; } public Article TheArticle { ...