ASP.NET Core Web API各种技术及选择
控制器父类用哪个控制器类都是继承自ControllerBase,而ASP.NET Core MVC项目中的控制器类默认继承自Controller。Controller类继承自ControllerBase,Controller类在ControllerBase的基础上增加了和视图相关的方法,而Web API的接口不涉及视图,因此除非读者需要在同一个控制器中同时提供Web API和MVC的功能,否则Web API的控制器类继承自ControllerBase即可。 操作方法的异步、返回值、状态码ACTION方法的异步1.Action方法既可以同步也可以异步。2.异步Action方法的名字一般不需要以Async结尾。3.Web API中Action方法的返回值如果是普通数据类型,那么返回值就会默认被序列化为Json格式。4.Web...
ASP.NET Core开发Web API
Web API项目的创建在项目模板中选择【ASP.NET Core Web API】创建项目。 可以看到,ASP.NET Core Web API项目的结构和ASP.NET Core MVC项目的结构非常类似,不同的是ASP.NET Core Web API项目没有Views文件夹,因为Web API直接返回的是结构化的数据,不需要提供展示数据的视图。项目中生成的样板代码WeatherForecastController是一个控制器类。 12345678910111213141516171819202122232425262728[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{ private static readonly string[] Summaries = new[] { "Freezing", "Bracing",...
ASP.NET Core MVC入门
ASP.NET Core MVC介绍Wbe应用是.NET Core开发中常见的项目类型,无论是网站还是HTTP服务接口,都有提供对外Web访问的能力,而.NET Core中进行Web应用开发的核心底层技术是ASP.NET Core。在ASP.NET Core这个底层基础上,微软开发了ASP.NET Core和ASP.NET Core API这两个框架。随着软件项目复杂度的增加及软件项目分工的细化,前后端分离已经成为主流开发模式,后端开发人员使用ASP.NET Core Web API开发服务接口,界面交互等有前端开发人员使用Vue等前端框架来完成。在ASP.NET Core MVC这种开发模式下,后端开发人员也仍然要编写一部分前端的代码,而在前后端分离的开发模式下,后端开发人员不在需要处理任何界面逻辑,而只是需要编写ASP.NET Core Web API。 编写第一个MVC程序ASP.NET Core...
EF Core表达式树
表达式树什么是表达式树表达式树(expression tree)是用树形数据结构来表示代码逻辑运算的技术,他让我们可以在运行时访问逻辑运算的结构。表达式树在.NET中对应Expression<TDelegate>类型。我们既可以让C#编译器帮我们从Lambda表达式生成表达式树,也可以在运行时通过API动态创建表达式树。 Lambda表达式生成表达式树。 12Expression<Func<House, bool>> expression = h => h.Price > 5;Expression<Func<House, House,double>>h2 = h2=(b1,b2)=>b1.Price +...
EF Core并发控制
EF Core优化之AsNoTrackingEF Core默认会对通过上下文查询出来的所有实体类进行跟踪,以便于在执行SaveChanges的时候把实体类的改变同步到数据库中。上下文不仅会跟踪对象的状态改变,还会通过快照的方式记录实体类的原始值,这是比较消耗资源的。因此,如果开发人员能够确认通过上下文查询出来的对象只是用来展示,不会发生状态改变,那么可以使用AsNoTracking方法告诉IQueryable在查询的时候“禁用跟踪”。 12345Blog[] blogs = ctx.Blogs.AsNoTracking().Take(3).ToArray();Blog b1 = blogs[0];b1.Id = 100;EntityEntry...
EF Core原理揭秘
EF Core原理揭秘既生IEnumerable,何生IQueryable可以使用LINQ中的Where等方法对普通集合进行处理。比如下面的C#代码可以把int数组中大于10的数据取出来。 12int[] nums={3,5,933,2,69,69,11};IEnumerable<int> items=nums.Where(n=>n>10); Where方法中,转到定义下,可以看到,这里调用的Where方法是Enumerable类中的扩展方法。 1IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source,Func<TSoure,bool> predicate); 也可以在EF Core的DbSet类型上调用Where之类的方法进行数据的筛选。 1IQueryable<Book>...
EF Core关系配置
关系配置推荐IDE:JetBrains Rider 一对多一对多是最常见的实体类的关系。比如文章和评论的关系就是一对多的关系,也就是一篇文章对应多条评论。 文章 1234567class Article{ public long Id { get; set; } //主键 public string Title { get; set; } //标题 public string Massage { get; set; } //内容 public List<Comment> Comments { get; set; }= new List<Comment>(); //此评论的多条评论} 评论 123456class Comment{ public long Id { get; set; } //主键 public string Massage { get; set; }...
EF Core入门
EF Core入门不同的EF Core数据库提供的质量参次不齐,除了微软官方的Microsoft SQL Server的EF Core数据库提供程序之外,还存在着很多第三方的EF Core数据库提供程序,它们对于EF Core的支持大部分是一致的,但是会有细微的差别。 EF Core环境搭建无论是在控制台项目中还是在ASP.NET Core项目中,EF Core的用法都是一样的。EF Core用于将对象和数据库中的表进行映射,因此在进行EF Core开发的时候,需要创建C#类(也叫作实体类)和数据库表两项内容。在经典的EF Core使用场景下,由开发人员编写实体类,然后EF Core可以根据实体类数据库表。 创建一个.NET Core控制台项目,然后再项目中创建Book实体类。1234567class Book{ public long Id { get; set; }//主键 public string Title { get; set; }//标题 public DateTime PubTime...
EF Core实体类配置
EF Core实体类配置约定大于配置主要的约定规则规则1:数据库表名采用上下文类中对应的DbSet的属性名。规则2:数据库表列的名字采用实体类属性的名字,列的数据库类型采用和实体类属性类型兼容的类型。比如在SQL Server中,string类型对应nvarchar,long类型对应bigint.规则3:数据库表列尔可空性取决于对应实体类熟悉的可空性。规则4:名字为Id的属性为主键,如果主键为short、int或者long类型,则主键默认采用自动增长类型的列。 Data Annotation(数据注解)Data Annotation指的是可以使用.NET提供的Attribute对实体类、属性等进行标注的方式来实现实体类配置。比如通过[Table(“T_Books”)],我们可以把实体类对应的表名配置为T_Books; 123456789//指定表名[Table("T_Cats")]class Cat{ public int Id { get; set; }//主键 [Required]//非空 ...
日志
日志日志(logging)是程序运行中的“黑匣子”,在程出现问题以后,我们可以通过分析日志来查询问题。 .NET Core日子基本使用.NET Core中的日志系统可以把日志记录到控制台、事件日志、调试窗口等地方,还可以使用第三方日志提供程序把日志记录到文件、日志服务器等地方。和配置系统一样,.NET Core中的日志提供了标准接口及官方的一些实现,同时允许开发人员编写第三方实现。些简单的把日志输出到控制台的使用方式。NuGet安装包日志系统核心的开发包 1Microsoft.Extensions.Logging 控制台输出日志包 1Microsoft.Extensions.Logging.Console 声明一个类 123456789101112131415161718192021222324252627class Recording{ private ILogger<Recording>logger; public Recording(ILogger<Recording> logger) { ...