随笔分类 - ASP.NET Core
摘要:一对一:关系配置EF Core中实体之间关系的配置的套路:HasXXX(...)WithXXX(...)有XXX、反之带有XXXXXX可选值One、Many 一对多:HasOne(...).WithMany(...)一对一:HasOne(...).WithOne(...)多对多:HasMany(..
阅读全文
摘要:方法1:标准日志class MyDbContext : DbContext{ public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder=>{builder.AddConsole();});
阅读全文
摘要:1、根据数据库表来反向生成实体类2、Scaffold-DbContext " "DefaultConnection": "Server=LAPTOP-3HE8JVHO\\MSSQLSERVER02;Database=RazorStudentDb;Trusted_Connection=True;Mul
阅读全文
摘要:1、使用迁移脚本,可以对当前连接的数据库执行编号更高的迁移,这个操作叫做“向上迁移(Up)”,也可以执行把数据库回退到旧的迁移,这个操作叫"向下迁移(Down)" 2、除非有特殊需要,否则不要删除Migratons文件下的代码 3、进一步分析Migrations下的代码。分析Up、Down等方法。查
阅读全文
摘要:1、Guid算法(或UUID算法)生成一个全局唯一的Id。适合于分布式系统,在进行多数据库数据合并的时候很简单。优点:简单,高并发,全局唯一缺点:磁盘空间占用大 2、Guid值不连续。使用Guid类型做主键的时候,不能把主键设置为聚集索引。因为聚集索引是按照顺序保存主键的,因此用Guid做主键性能差
阅读全文
摘要:自增主键1、EF Core支持多种主键生成策略:自动增长:Guid;Hi/Lo算法等2、自动增长优点:简单缺点:数据库迁移以及分布式系统中比较麻烦;并发性能差。long、int等类型主键,默认是自增。因为是数据库生成的值,所以SaveChanges后UI自欧东把主键的值更新到Id属性。3、自增字段的
阅读全文
摘要:1、Data Annotation把配置以特性(Annotation)的形式标注在实体类中[Table("T_Dogs")]public class Dog{ public int Id { get; set; } [Required] [MaxLength(22)] public string N
阅读全文
摘要:1、表名采用DbContext中的对应的DbSet的属性名2、数据表列的名字采用实体类属性的名字,列的数据类型采用和实体类属性类型最兼容的类型3、数据表列的可空性取决于对应实体类属性的可空性4、名字为Id的属性为主键,如果主键为short、int或者long类型,则默认采用自增字段,如果主键为Gui
阅读全文
摘要:.NET中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配置源。可以跟踪配置的改变,可以按照优先级覆盖
阅读全文
摘要:1、日志级别:Trace < Debug < Information < Warning < Error < Critical2、日志提供者(LoggingProvider):把日志输出到哪里。控制台、文件、数据库等3、.NET的日志非常灵活,对应业务代码只要注入日志对象记录日志即可,具体哪些日志输
阅读全文
摘要:1、表达式树(Expression Tree):树形数据结构表示代码,以表示逻辑运算,以便可以在运行时访问逻辑运算的结构 2、Expression<TDelegate>类型 3、从Lambda表达式来生成表达式树Expression<Func<Book,bool>> e = b =>b.Price
阅读全文
摘要:乐观并发控制的原理Update T_Table set Owner = 新值 where Id = 1 and Owner = 旧值当Update的时候,如果数据库中的Owner值已经被其他操作者更新为了其他值了,那么where语句的值就会为false,因此这个Update语句影响了行数就是0,EF
阅读全文
摘要:并发控制的概念1、并发控制:避免多个用户同时操作资源造成的并发冲突问题。举例:统计点击量2、最好的解决方案:非数据库解决方案3、数据库层面的两种策略:悲观、乐观 1、悲观并发控制一般采用行锁、表锁等排他锁对资源进行锁定,确保同时只有一个使用者操作被锁定的资源 2、EFCore没有封装悲观并发控制的使
阅读全文
摘要:快照更改跟踪:首次跟踪一个实体的时候,EFCore会创建这个实体的快照。执行SaveChanges()等方法时,EFCore将会把存储的快照中的值与实体的当前值进行比较。 实体的状态已添加(Added):DbContext正在跟踪此实体,但数据库中尚不存在该实体 未改变(Unchanged):DbC
阅读全文
摘要:方式一:ToListAsync()、ToArrayAsync()。结果集不要太大方式二:await foreach(Book b in ctx.Books.AsAsyncEnumerable())不过,一般没必要这么做
阅读全文
摘要:对比1、DataReader:分批从数据库服务器读取数据。内存占用小、DB连接占用时间长2、DataTable:把所有数据都一次性从数据库服务器都加载到客户端内存中。内存占用大,节省DB连接 验证IQueryable用什么方式1、用insert into select 多插入一些数据,然后加上Del
阅读全文
摘要:1、IQueryable只是代表一个"可以放到数据库服务器去执行的查询",它没有立即执行,只是"可以被执行"而已 2、对于IQueryable接口调用非终结方法的时候不会执行查询,而调用终结方法的时候则会立即执行查询 3、终结方法:遍历、ToArray()、ToList()、Min()、Max()、
阅读全文
摘要:不同的WHERE方法1、对普通集合和DbSet调用的Where方法,虽然用起来一样,但是"转到定义"后看到的是不同的方法2、普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句(服务器端评估)
阅读全文
摘要:async的方法会被C#编译器编译成一个类,会主要根据await调用进行切分为多个状态,对async方法的调用会被拆分为对MoveNext的调用。用await看似是"等待",经过编译后,其实没有"wait"
阅读全文
摘要:1)异步方法的返回值一般是Task<T>,T是真正的返回值类型Task<int>。惯例:异步方法名字以Async结尾2)即使方法没有返回值,也最好把返回值声明为非泛型的Task3)调用异步方法时,一般在方法前加上await,这样拿到的返回值就是泛型指定的T类型4)异步方法的"传染性":一个方法中如果
阅读全文

浙公网安备 33010602011771号