C#
C#编程
一稻道人
当世俗人,偶有不俗之志。
展开
-
EntityFramework Core入门教程-03-表添加约束
创建数据库表的时候通常要对相关的列添加约束,例如长度,默认值,格式等,如下代码:添加约束时需引用using System.ComponentModel.DataAnnotationspublic class Club{ public Club() { Players = new List<Player>(); } public int Id { get; set; } [Required] [MaxLength(20)]原创 2020-06-25 15:40:31 · 244 阅读 · 0 评论 -
EntityFramework Core入门教程-08-修改数据1
EFCore更新数据有两种方式:1.更新每一个字段(当前entity脱离了context跟踪)场景:entity从前端传到后台,然后调用context更新void UpdateLeague(League league){ _context.Leagues.Update(league); _context.Leagues.SaveChanges();}2.只更新部分修改的字段(当前entity被context跟踪)本例leagues从context冲读出来,一直被context追踪,修改了原创 2020-06-25 17:32:00 · 376 阅读 · 0 评论 -
EntityFramework Core入门教程-10-视图、存储过程、无主键entity
使用EFCore,不能在数据库中直接操作,需要将视图和存储过程,放到一个migration当中就可以了无主键entity,参考官方文档。原创 2020-06-25 23:29:17 · 539 阅读 · 0 评论 -
EntityFramework Core入门教程-05-查询
方式一:查询原理:前面两行只是创建了查询语句,并没有执行查询数据库操作,和linq一样,只有加上toList()或类似方法,才会执行查询数据库的操作var leagues1 = context.Leagues .Where(x => x.Country.Contains("e")) .ToList();方式二:上面的查询也可以用EF的方法实现var leagues11 = context.Leagues .W原创 2020-06-25 17:03:21 · 340 阅读 · 0 评论 -
EntityFramework Core入门教程-07-级联查询 (关联数据查询)
级联查询include关键字注意:1.IQueryable类型才会有Include,因此不能将Include方法哦FirstOrDefault后面2.Find方法也不支持Include,Find不属于linq的方法,它是DbSet的方法常规语法:_context.Enitties .Where(...) .Include(...) .ToList()//FirstOrDefault()案例:将Club关联的League和Player全部查询出来var club = contex原创 2020-06-25 19:09:44 · 2576 阅读 · 0 评论 -
EntityFramework Core入门教程-01-搭建基础环境
新建solution, 添加类库 model层1 用vs2019,新建一个空的Solution命名为Demo,在该solution新建一个类库(.net standard),命名为Demo.Domain,用来存储一些model2 创建model public class Player { public int Id { get; set; } public string Name { get; set; } p原创 2020-06-23 22:21:55 · 497 阅读 · 0 评论 -
EntityFramework Core入门教程-04-插入数据
通过实例化DbContext,对数据库进行插入,EFCore提供了四个接口插入:context.Leagues.Add();context.Leagues.AddRange();context.Add();context.AddRange();using var context = new ContextDemo();//C#8语法,当前方法结束后释放资源//添加一条数据var league1 = new League{ Name = "LeagueA"};context.Le原创 2020-06-25 16:15:34 · 762 阅读 · 0 评论 -
EntityFramework Core入门教程-06-删除数据
四种方式删除var club1 = context.Clubs.Single(x => x.Name == "Club1");//方式1context.Clubs.Remove(club1);//方式2context.Remove(club1);var club2 = context.Clubs.Single(x => x.Name == "Club2");//方式3 删除多个context.Clubs.RemoveRange(club1, club2);//方式3 删原创 2020-06-25 17:18:09 · 310 阅读 · 0 评论 -
EntityFramework Core入门教程-08-修改关系数据2
一对一关系表(一)为导航属性赋新值1 跟踪模式下为导航属性赋值,savechange() 新增一条导航属性表记录2 离线模式下,Attach方法可以实现和跟踪模式下同样的效果注:跟踪模式下var player = context.Players .OrderBy(x => x.Id) .Last();player.Resume = new Resume{ Description = "this is resume", Pla原创 2020-06-25 23:07:29 · 175 阅读 · 0 评论 -
EntityFramework Core入门教程-11-使用原生的SQL
原生SQL查询DbSet提供了四个方法用来执行原生的sql查询(一)执行非字符串插值的字符串1 FromSQLRaw("select *...");2 FromSQLRawAsync("select * ...");(二 )执行字符串插值的字符串,用C#6 新语法,用$C#6.0新语法:3 FromSQLIntepolated($"selct * from where x={var}");4 FromSQLIntepolatedAsync($"selct * from where x={v原创 2020-06-26 00:13:37 · 1905 阅读 · 0 评论 -
EntityFramework Core入门教程-09-追踪模式和离线模式
概念追踪模式:用dbcontext 操作过的数据记录在dbcontext没有释放之前,在dbcontext都可以追踪到离线模式:用dbcontext操作数据后立即释放资源,dbcontext不会对这些数据进行追踪追踪模式:优点:减少与数据库的交互,提高查询效率缺点:数据量较多情况下耗内存离线模式:优点:对内存占用少缺点:每次数据操作都需要直接和数据库交互,查询速度不如追踪模式配置离线 模式EFCore dbcontex默认都是追踪模式,配置离线模式有两种方式:1 全局配置,作用域当前原创 2020-06-25 23:20:33 · 274 阅读 · 0 评论 -
EntityFramework Core入门教程-02-创建关系表
一对多关系以下三个类:1 在Club中添加了League的导航属性,但是League中并没有添加对Club的引用,说明允许多个Club中添加同一个League的导航属性,League:Club=1:n2 在Club中添加了Player集合的导航属性,说明一个Club中可以引用多个Player,但是Player中没有添加对Club的引用,说明Club:Player=1:n3 在类中没有创建体现一对多关系的外键属性,update-database的时候,EFCore会自动创建外键外键在多的一方创建:原创 2020-06-25 13:01:45 · 508 阅读 · 0 评论 -
MyBatis.net 一对多查询sqlmap配置
//Car 和 User 关系:一对多 public class CarEntity : BaseEntity { public string CarId { get; set; } public string CarName { get; set; } public IList<UserEntity> UserList; } public class UserEntity : BaseEntity {...原创 2020-05-18 16:09:41 · 153 阅读 · 0 评论 -
C#临时变量---闭包
代码段1的输出结果不规则,大都>45代码段2的输出和预期的一样,1-49全部输出原因是两断代码i对于循环体都是全局变量,而外层的for循环运行很快,内层需要创建任务,当内层开始执行第一个任务的时候,外层for循环已经快结束或已经结束,所以代码段1的输出结果不规则代码段2每次进行循环都会创建在新的作用域中创建一个新的临时变量,执行每个task的时候都会找对应作用域中的临时变量代码段1: for (int i = 0; i < 50; i++) { Task.Run(() =&原创 2020-07-01 00:32:39 · 1201 阅读 · 0 评论 -
.net framework autoMapper使用
DDD开发模式经常会用到dto(数据传输对象)和entity(实体),dto和entity中的属性有重合的部分,将dto中的数据持久化到数据库中时,为了保证领域实体不被污染,往往需要将dto转化为entity,单个属性的赋值会比较麻烦,如何实现将dto自动map到entity中呢?基于.net framwork的工程可以在nuget中下载 AutoMapp类库(不支持.net core),具体实现如下: class PersonEntity { public string原创 2020-06-20 10:06:49 · 1912 阅读 · 0 评论 -
C# 线程安全问题
什么是线程安全如果你的代码在进程中有多个线程同时运行一段代码,如果每次执行的结果都和单线程运行时的结果一致, 那么就是线程安全的先看下面两段代码,执行结果是否一样?int num1 = 0;int num2 = 0;for (int i = 0; i < 1000; i++){ num1++;}for (int i = 0; i < 1000; i++){ Task.Run(() => { num2++; });}C原创 2020-07-03 00:04:47 · 1155 阅读 · 0 评论 -
C# Thead类扩展封装
场景一: 使用Thread创建两个线程A 和B,如何顺序执行这两个线程,即确保执行完A再执行B?解决方案:代码就不写了比较简单,思路:再启动一个线程,在这个线程里按顺序start A和B,即能保证先执行A再执行B、场景二:使用Thread开辟新的线程执行任务,如何获取返回结果?思路:定义Func委托,在线程里执行此委托,即可获取返回值方式一:启动线程后,直接阻塞线程,取得返回值,这种操作会阻塞主线程,造成界面卡顿,不推荐使用。Func<int> func = () =>{原创 2020-06-27 01:49:45 · 348 阅读 · 0 评论 -
C#对象和字典 map
引言在日常开发中,除了会遇到两个类对象之间的map(具体见本系列上一章)。由于实际开发过程中业务的需求,还可能遇到其他的形式的数据集合和类对象map,比如一个字典中的数据和一个对象实现map,那么如何将一个字典中的值映射到一个类对象上呢?案例 //创建一个Person类,类中属性名称和下面字典中的key一致 public class Person { public string Name { get; set; } public string Age { get原创 2020-06-23 19:20:46 · 2802 阅读 · 0 评论 -
C# 线程异常 捕获
要想捕获在主线程捕获其他线程异常,需阻塞主线程,等所有线程执行结束,方可捕获异常;否则无法捕获异常;下面这种方式,线程抛出异常,代码走不进catch,catch无法捕获隐藏static void GetThreadException1(){ try { Task.Run(() => { Console.WriteLine("dosomething"); throw new Exception("te原创 2020-06-27 20:48:35 · 1511 阅读 · 0 评论 -
C# Thread类常用的API
var thread = new Thread(() =>{ Console.WriteLine("dosomething");});开启一个新线程thread.Start();线程挂起,已经过期的方法//thread.Suspend();//thread.Resume();//线程恢复,已经过期的方法终结线程,抛出一个异常thread.Abort();把终结的线程再次启动,会有延时Thread.ResetAbort();设置优先级,不能保证一定会优先执行,只是提原创 2020-06-26 18:09:36 · 971 阅读 · 0 评论 -
C#多线程之 Parallel
前言:Parallel 是 .NetFramwwork 4.5 提供的功能,是对Task的进一步封装。开启线程Parallel是一个静态类,调用静态方法Invoke即可开启多个线程,Invoke方法接收Action委托的数组。开启多线程会并行执行,直到开启的线程执行完毕,才会继续执行主线程,实现功能类似于Task.WaitAll()即会阻塞主线程,解决方案见接下来分析。Parallel.Invoke( () => Console.WriteLine("do something1")原创 2020-06-27 16:44:38 · 1421 阅读 · 0 评论 -
C# 泛型类型、泛型方法
泛型类型 Generic types泛型会声明类型参数—泛型的消费者需要提供类型参数来把占位符类型填充public class Stack<T>{ int positon; T[] data=new T[100]; public void Push(T obj)=>data[position++]=obj; public T Pop()=>data[--position];}var stack=new Stack<int>();stack.Push(原创 2020-06-19 00:16:36 · 1460 阅读 · 0 评论 -
C#中锁的使用分类
1 互斥锁lock(基于Monitor实现)定义:private static readonly object Lock = new object();使用:lock (Lock){ //todo}作用:将会锁住代码块的内容,并阻止其他线程进入该代码块,直到该代码块运行完成,释放该锁。注意:定义的锁对象应该是 私有的,静态的,只读的,引用类型的对象,这样可以防止外部改变锁对象2 互斥锁Monitor定义:private static readonly object Lock = n原创 2020-07-10 23:15:12 · 3318 阅读 · 0 评论 -
C# 协变、逆变、不变
类型参数和转换C#的转化操作符支持下列转换:数值转换引用转换装箱拆箱转换自定义转换决定采用的是哪种转换,发生在编译时,根据已知类型的操作数来决定。原创 2020-06-19 08:01:24 · 203 阅读 · 0 评论 -
curl发送文件,服务端(C#)下载文件
前言最近有个需求,用tfs发布项目之后,在后续任务中通过脚本来传动文件给其他系统。选择使用curl命令行工具来实现。这里面有一个坑:如果tfs代理服务器是linux,可以选择使用shell脚本,且linux原生支持curl。如果tfs代理服务器是windows,应该选择命令行,且windows系统在win10 1803版本后才默认支持curl,之前的版本需要安装curl。而我的机器是windows,所以需要安装curl。curl安装这里不再多余陈述,到官网下载即可。按照说明装完之后,配置环境原创 2020-10-19 23:24:23 · 605 阅读 · 0 评论 -
C#多线程之 Thread
方式一:ThreadStart无参无返回值委托类型作为构造函数 ,只支持无返回值且无参数委托//ThreadStart委托类型作为构造函数,只支持无返回值且无参数委托ThreadStart threadStart = () =>{ Thread.Sleep(400); Console.WriteLine($"thread1:do something");};Thread thread1 = new Thread(threadStart);thread1.Start();//原创 2020-06-26 17:55:42 · 240 阅读 · 0 评论 -
C# 委托实现异步调用和异步等待(一)
前言:本篇使用无返回值委托Action做介绍友情提醒:阅读本篇需有委托的基础知识,小白请跳过。使用委托下面这段代码是使用委托的一种方式,一般写代码的时候不会这么写,在此只做案例。调用invoke执行委托方法,此时主线程被阻塞,需等到委托方法执行完毕才会继续执行下去,和调用普通的接口没什么区别。那么如何调用委托时,让主线程继续走下去呢? Action<string> action = DoSomething; action.Invoke("function");//阻塞主原创 2020-06-26 16:20:57 · 2017 阅读 · 0 评论 -
C# http request response
var request = (HttpWebRequest)WebRequest.Create(url);request.Method = "POST";request.ContentType = "application/json";//构造要传递的json对象 (Jobject的实例)var postData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(jObject));request.ContentLength = postDa原创 2020-10-11 20:06:36 · 751 阅读 · 0 评论 -
C#多线程之 Task
Task类是.NetFramework3.0提供的功能,是C#多线程系列的集大成者,提供了丰富的API线程池是单例的,Task中的线程源于线程池启动线程使用task启动新线程有四种方式:var task1 = new Task(() => Console.WriteLine("dosomething1"));task1.Start();var task2 = Task.Run(() => Console.WriteLine("dosomething2"));var taskFa原创 2020-06-27 15:40:31 · 645 阅读 · 0 评论 -
WebApi入门(一)
1 简介WebApi是一个为前端提供数据的框架,它不关心业务和UI。WebApi实现了基于restful架构的Http请求方式,即执行Http请求的时候加上一定的语义。RESTful理解:点击这里主要有四种语义场景:Post:用于提交数据Get:用于查询获取数据Put:修改数据Delete:删除数据通过这些语义场景来实现不同的功能,也有人觉得这样做不好,于是他们便不严格遵守rest原则,只遵循其中一部分,例如:将所有数据的修改(增 该 删)都用Post,查询用Get2 新建一个Web原创 2020-07-09 00:06:48 · 659 阅读 · 0 评论 -
下载制作nuget包工具 NugetPackageExplorer
1.下载地址:https://github.com/NuGetPackageExplorer/NuGetPackageExplorer不出意外,前面两台国内都无法下载,采用第三种下载方式2.点击第三个链接:会提醒在命令行中运行以上脚本,但windows(我是win10)下运行后发现报错,无法识别choco命令3.解决方案:命令行中依次执行以下命令:1.Set-ExecutionPolicy -ExecutionPolicy RemoteSigned2.iwr http.原创 2020-11-01 22:33:06 · 1301 阅读 · 0 评论 -
C# out、ref
out 和 ref都是传地址,使用后改变原来参数的值var v = 10;Test1(out v);Console.WriteLine(v);//100Test2(ref v);Console.WriteLine(v);//200 static void Test1(out int val) { val = 100; } static void Test2(ref int val) { val = 200; }out 关键字out 关键字修饰后,外层使用原创 2020-06-28 07:58:23 · 121 阅读 · 0 评论 -
C# using使用场景
using 关键字有两个主要用途:(一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。(二).作为语句,用于定义一个范围,在此范围的末尾将释放对象。(一).作为指令1、添加命名空间里 引用using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到。例如:using System; 一般都会出现在*.cs中。2、为命名空间或类型创建别名,using +原创 2020-07-10 22:11:10 · 361 阅读 · 0 评论 -
静态构造函数该如何使用
类的静态构造函数不属于任何一个类的实例,具有如下几个特点:1.static关键字修饰,无返回类型,无参数的构造函数2.不能通过代码显式的调用静态构造函数3.静态构造函数在类的静态成员第一个范文或第一个类实例创建之前由系统调用4.静态构造函数最多运行一次5.静态构造函数必须显式定义,若不定义,则不存在默认静态构造函数6.一个类中最多只能定义一个静态构造函数7.静态构造函数主要完成的是静态数据成员的初始化工作,若定义静态数据成员的时候进行初始化,同时在静态构造函数中进行了初始化,则以静态构造函数的原创 2020-09-16 20:53:31 · 190 阅读 · 0 评论 -
C# 委托实现异步调用和异步等待(二)
使用Func带返回值委托,异步调用使用EndInvoke阻塞进程,获取委托函数返回值Func<int> func = ()=>{ Thread.Sleep(600); Console.WriteLine("funtion processing"); return DateTime.Now.Day;};IAsyncResult result=null;result = func.BeginInvoke(asyncResult =>{ Co原创 2020-06-26 16:41:36 · 252 阅读 · 0 评论 -
C#多线程之 线程池 ThreadPool介绍
背景ThreadPool是.NetFramework2.0的功能,Thread功能繁多反而不是特别好用,因此提出线程池的概念;使用线程池,不需要程序员去销毁线程。线程池中存放多个线程对象,需要的时候从池子里获取,用完之火不用销毁,放回池子。优点:节约资源,提升性能;管控总数量,防止滥用。使用ThreadPool开启新线程方式一:QueueUserWorkItem 接收一个参数,参数类型是WaitCallback 它是一个无返回值委托,委托函数接收一个obejct类型参数。官方定义:public原创 2020-06-27 10:52:32 · 1734 阅读 · 0 评论 -
部署在IIS上的服务如何拿到windows凭据
常规访问windows凭据方式:用vs新建一个web站点或者webapi,或者新建一个console应用程序,使用vs 启动程序,以下代码都可以拿到当前windows用户登录的凭据,来连接需要此凭据才能访问的站点。 var vscredential = new VssAadCredential(); var tpc = new TfsTeamProjectCollection(new Uri("your request url"), vscredential); tpc.Authenticate(原创 2020-10-09 18:27:54 · 622 阅读 · 0 评论 -
忽略https证书
C#忽略https证书设置:ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, error) => true;原创 2021-01-19 15:51:21 · 576 阅读 · 0 评论 -
devops开发,无法加载Microsoft.WITDataStore64.dll
近期由于业务需求,需要通过tfs实现一些功能。通过vs2019编译和本地调试没有什么问题。但是Publish之后,在调用tfs接口查询workstore的时候报错“无法加载Microsoft.WITDataStore64.dll”,仔细查了下,在发布的根目录下确实没有这个dll文件,而通过vs2019编译后的bin目录下是有这个动态库的,因此需要手动将这个dll复制到publish的目录下,问题得到解决。参考链接:https://stackoverflow.com/questions/405806原创 2020-10-15 22:31:42 · 143 阅读 · 0 评论 -
C# 线程取消
方案一:定义一个中间变量,异常时赋值,下次再执行时根据中间变量的值判断是否终止当前线程方案二:Task.Run有一个重载方法,利用第二个参数可以终止当前线程CancellationTokenSource cts = new CancellationTokenSource();for (int i = 0; i < 50; i++){ var value = i; Task.Run(() => { try {原创 2020-07-01 00:16:11 · 1434 阅读 · 0 评论