EFCore_一些注意事项
主键策略自增主键1、EF Core支持多种主键生成策略:自动增长、Guid、Hi/Lo算法等。2、自动增长优点:简单;缺点:数据库迁移以及分布式系统中比较麻烦;并发性能差。long、int等类型主键,默认是自增的。因为是数据库生成的值,所以SavaChanges后会自动把主键的值更新到Id属性。3、自增字段的代码中不能为Id赋值,必须保持默认值0,否则运行的时候会报错。
Guid主键1、Guid算法(或UUID算法)生成一个全局唯一的Id。适合于分布式系统,在进行多数据库数据合并时很简单。优点:简单、高并发效率比自增主键高、全局唯一;缺点:磁盘空间占用大。2、Guid值不连续。使用Guid类型做主键的时候,不能把主键设置为聚集索引。因为聚集索引是按照顺序保存主键的,因此用Guid做主键性能差。比如MySql的InnoDB引擎中主键是强制使用聚集索引的。有的数据库支持部分的连续Guid,比如SQLServer中的NewSequentialId(),但也不能解决问题。在SQLServer等中,不要把Guid主键设置为聚集索引;在MySQL中,插入频繁的表不要用Guid做主键。
1 ...
EFCore_FluentAPI
约定配置主要规则:1、表名采用DbContext中对应DbSet的属性名。2、数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型。3、数据表列的可空性取决于对应实体类属性的可空性。4、名字为Id 的属性为主键,如果主键为short、int、long类型,则默认采用自增字段,如果主键为Guid类型,则默认采用默认的Guid生成机制生成主键值。
两种配置方式1、Data Annotation把配置以特性(Annotation)的形式标注在实体类中。
12345678910[Table("T_Perosns")]public class Person { public int id { get; set; } [Required()] [MaxLength(100)] public string name { get; set; } public int age { get; set; } public string sex { ...
EFCore_简单使用
EFCore简介ORM:让开发者用对象操作的形式操作关系型数据库。EFCore、Dapper就是常见的ORM
应用程序通过EF Core将C#代码变成Sql语句借助Ado.Net Core与数据库进行操作。
使用建议1、对于后台系统、信息系统等和数据库相关开发工作量大的系统,且团队比较稳定就用EFCore;对于互联网系统等数据库相关工作量不大的系统,或者团队不稳定就用Dapper2、在项目中可以混用,只要注意EFCore的缓存、Tracking等问题即可。
EFCore和EF比较1、EF有DB First、Model First、Code First。EFCore不支持模型优先,推荐使用代码优先,遗留系统可以使用Scaffold DbContext来生成代码实现类似DB First的效果,但是推荐使用Code First。2、EF会对实体上的标注做校验,EF Core追求轻量化,不校验。3、EFCore加了很多新东西。4、EF中的一些类的命名空间以及一些方法的名字在EF Core中稍有不同。5、EF不再做新特性增加。6、EF Core是对底层ADO.NET Core的封装,因此ADO. ...
Asp.NetCore_SignalR
WebSocket需求:Web聊天、站内通知传统HTTP只能客户端主动发送请求传统长轮询方式性能差,不推荐使用基于Tcp协议,支持二进制通信,双工通信性能和并发能力强WebSocket独立于HTTP协议,不过我们一般仍然把WebSocket服务器端部署到Web服务器,因为可以借助HTTP协议完成初始的握手(可选),并且共享HTTP服务器的端口(主要),通过请求的特点决定将请求交给HTTP处理程序或者WebSocket处理程序。
ASP.NET Core SignalR1、SignalR是对.NET Core平台下对WebSocket的封装2、Hub(集线器)类似于路由器,是数据交换中心
使用创建web api项目,创建一个继承Hub的类
123456789public class MyHub : Hub{//这个方法名由客户端调用 public Task SendPublicMsgAsync(string msg) { string connId = this.Context.ConnectionId; string msgToSe ...
Asp.NetCore_校验机制
校验机制.Net Core内置1、在.Net Core中内置了对数据校验的支持,在System.ComponentModel.DataAnnotations这个命名空间下有如:[Required]、[EamilAddress]、[RegularExpression]。CustomValidationAttribute、IValidatableObject。2、内置的校验机制的问题:校验规则都是和模型类耦合在一起,违反“单一职责原则”,很多常用的校验都需要编写自定义校验规则,而且写起来麻烦。
1234567public class DataTest { [Required] public string UserName { get; set; } public string Password { get; set; } [EmailAddress] public string Email { get; set; } }
第三方包(F ...
Asp.NetCore_托管服务
托管服务1、让代码运行在后台。比如服务器启动的时候在后台预先加载数据到缓存,每天凌晨三点把数据导出到备份数据库,每五秒在两张表之间同步一次数据。2、托管服务实现IHostedService接口,一般编写从BackgroundService继承的类。3、services.AddHostedService<DemoBgService>
12345678public class HostedService1 : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) { //在这里面执行后台代码 Console.WriteLine("后台启动"); await Task.Delay(3000); Console.WriteLine("后台代码执行完成"); } ...
Asp.NetCore_JWT
JWTSession描述在浏览器端用户登录后,服务器端生成唯一session id,并且把用户名和session id建立对应关系保存到服务器端,当下次浏览器端访问时携带着cookie和服务器保存session对应,就可以直接登录了。
Session缺点1、对于分布式集群环境,session数据保存在服务器内存中就不合适了,应该放到一个中心状态服务器上。ASP.NET Core支持Session采用Redis、Memcached。2、中心状态服务器有性能问题。
JWT描述1、JWT把登陆信息保存在客户端。2、为了防止客户端数据造假,保存在客户端的令牌经过了签名处理,而签名的密钥只有服务器端才知道,每次服务器端收到客户端提交过来的令牌的时候都要检查一下签名。3、JWT是明文存储的,不要把不能被客户端知道的信息放到JWT中。
JWT优点1、状态保存在客户端,天然适合分布式签名。2、签名保证了客户端无法数据造假。3、性能更高,不需要和中心状态服务器通讯,纯内存计算。
JWT基本使用NuGet安装:System.IdentityModel.Token,生成和校验JWT生成:
123456789 ...
Asp.NetCore_标识框架
标识框架(Identity)Authentication与Authorization1、Authentication对访问者的用户进行验证,“用户是否登录”。2、Authorization验证访问者的用户身份是否有对资源访问的访问权限,“用户是否有权限访问地址”用户可能有多个角色,一个角色可能有多个用户。
标识框架概念1、Identity采用基于角色的访问控制(RBAC)策略,内置了对用户、角色等表的管理,以及相关的接口,支持外部登录、2FA(两阶段验证)等。2、标识框架使用EFCore对数据库进行操作,因此标识框架几乎支持所有数据库。
简单使用1、创建用户类和角色类,一般不自己编写而是创建继承IdentityUser<TKey>、IdentityRole<TKey>的自定义类类,TKey代表主键的类型,可以增加自定义属性。2、NuGet安装:Microsoft.AspNetCore.Identity.EntityFrameworkCore。3、创建继承自IdentityDbContext的类,这个类内置了对IdentityUser<TKey>、Id ...
Asp.NetCore_中间件
中间件概念我怕我解释不清楚,这里直接上课件
基本使用我们建立一个空的asp.net core项目
123456789101112131415161718192021222324public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); //app.MapGet("/", () => "Hello World!"); app.Map("/test", async (pipeBuilder) => { pipeBuilder.Use(async (context, next) => { context.Response.ContentType = " ...
Asp.NetCore_筛选器
筛选器Filter1、Filter是面向切面编程机制,在ASP.NET Core特定的位置执行我们自定义的代码2、有5种Filter类型:Authorization filter、Resource filter、Action filter、Exception filter、Result filter。3、所有筛选器一般有同步异步两个版本比如IActionFilter、IAsyncActionFilter接口
异常筛选器当系统中出现未经处理的异常时,异常筛选器会执行。目标:当系统中出现未处理异常的时候,我们统一给客户端返回如下格式的响应报文:{“code”:”500”,”message”:”异常信息”},对于开发环境中message是异常堆栈,对于其他环境message用一个general的报错信息。实现:实现IAsyncExceptionFilter接口。注入IHostEnvironment得知运行环境。
123456//Action方法 [HttpGet] public string MakeErr() { string s ...