2.4.3 EF Core -- 基础与配置连接字符串

异步编程

日志

DbContext池

类和配置表

属性和列配置

并发token

索引

连接字符串

在 http://ASP.NET Core 配置系统非常灵活,并且可以将连接字符串存储在 appsettings.json 、环境变量、用户密钥存储或其他配置源中

appsettings.json

{

"ConnectionStrings": {

"BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"

},

}

异步编程

当在数据库中执行查询时,异步操作将避免阻止线程。 异步操作对于在丰富的客户端应用程序中保持响应式 UI 非常重要,并且还可以增加 web 应用程序中的吞吐量,在这些应用程序中,它们可释放线程以处理 web 应用程序中的其他请求

var blog = new Blog { Url = "http://sample.com" };

context.Blogs.Add(blog);

await context.SaveChangesAsync();

日志

Entity Framework Core (EF Core) 与完全集成 Microsoft.Extensions.Logging

appsettings.json

"Microsoft.EntityFrameworkCore.Database.Command": "Debug"

启动程序,查询列表,控制台输出

dbug: Microsoft.EntityFrameworkCore.Database.Command[20103]

Creating DbCommand for 'ExecuteReader'.

dbug: Microsoft.EntityFrameworkCore.Database.Command[20104]

Created DbCommand for 'ExecuteReader' (10ms).

dbug: Microsoft.EntityFrameworkCore.Database.Command[20100]

Executing DbCommand [Parameters=[], CommandType='Text', CommandTimeout='30']

SELECT `p`.`Id`, `p`.`CreatedAt`, `p`.`CreatedBy`, `p`.`EndDate`, `p`.`IdentityId`, `p`.`LastUpdateAt`, `p`.`LastUpdateBy`, `p`.`PlanId`, `p`.`StartDate`, `p`.`SupervisorId`, `p`.`TenantId`, `p`.`Title`, `p`.`UserId`

FROM `Projects` AS `p`

info: Microsoft.EntityFrameworkCore.Database.Command[20101]

Executed DbCommand (82ms) [Parameters=[], CommandType='Text', CommandTimeout='30']

SELECT `p`.`Id`, `p`.`CreatedAt`, `p`.`CreatedBy`, `p`.`EndDate`, `p`.`IdentityId`, `p`.`LastUpdateAt`, `p`.`LastUpdateBy`, `p`.`PlanId`, `p`.`StartDate`, `p`.`SupervisorId`, `p`.`TenantId`, `p`.`Title`, `p`.`UserId`

FROM `Projects` AS `p`

dbug: Microsoft.EntityFrameworkCore.Database.Command[20300]

A data reader was disposed.

DbContext池

AddDbContextPool 启用实例的池 DbContext 。 上下文池可以通过重复使用上下文实例,而不是为每个请求创建新实例,从而提高大规模方案(如 web 服务器)的吞吐量。

services.AddDbContextPool(options =>

{

options.UseMySql(Configuration.GetConnectionString("LighterDbContext"));

});

AddDbContextPool使用时,在请求上下文实例时,EF 首先检查池中是否有可用的实例。 请求处理完成后,实例的任何状态都将被重置,并且实例本身会返回池中。

避免在维护状态的应用程序中使用上下文池。 例如,不应在请求之间共享的上下文中的私有字段。 在将上下文实例添加到池中之前,EF Core 仅重置它知道的状态。

除高度优化的方案外,池的性能提升通常可以忽略不计。

类和配置表

在模型中包含类型

class MyContext : DbContext

{

// 对应一张表(推荐)

public DbSet Blogs { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

// 对应一张表

modelBuilder.Entity();

}

}

public class Blog

{

public int BlogId { get; set; }

public string Url { get; set; }

public List Posts { get; set; }

}

public class Post

{

public int PostId { get; set; }

public string Title { get; set; }

public string Content { get; set; }

public Blog Blog { get; set; }

}

public class AuditEntry

{

public int AuditEntryId { get; set; }

public string Username { get; set; }

public string Action { get; set; }

}

从模型中排除类型

[NotMapped]

public class BlogMetadata

{

public DateTime LoadedFromDatabase { get; set; }

}

从迁移中排除

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity()

.ToTable("AspNetUsers", t => t.ExcludeFromMigrations());

}

属性和列配置包含和排除的属性

列名

自动生成列

包含和排除的属性

数据批注

public class Blog

{

public int BlogId { get; set; }

public string Url { get; set; }

[NotMapped]

public DateTime LoadedFromDatabase { get; set; }

}

Fluent API

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity()

.Ignore(b => b.LoadedFromDatabase);

}

列名

数据批注

public class Blog

{

[Column("blog_id")]

public int BlogId { get; set; }

public string Url { get; set; }

}

Fluent API (推荐)

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity()

.Property(b => b.BlogId)

.HasColumnName("blog_id");

}

按照约定,将名为 Id 或的属性 Id 配置为实体的主键。

class Car

{

public string Id { get; set; }

public string Make { get; set; }

public string Model { get; set; }

}

class Truck

{

public string TruckId { get; set; }

public string Make { get; set; }

public string Model { get; set; }

}

可以将单个属性配置为实体的主键

数据批注

class Car

{

[Key]

public string LicensePlate { get; set; }

public string Make { get; set; }

public string Model { get; set; }

}

Fluent API

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity()

.HasKey(c => c.LicensePlate);

}

自动生成列

通过 Fluent API 的方式添加自增列

LighterDbContext

modelBuilder.Entity().Property(p => p.Id).ValueGeneratedOnAdd();

注释控制器中 Id 的赋值

ProjectController

//project.Id = Guid.NewGuid().ToString();

新增一条数据,返回 Id 是自动生成的

通过数据批注方式添加创建时间,修改时间默认值

Entity

///

/// 创建时间

///

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public DateTime CreatedAt { get; set; }

///

/// 最后修改时间

///

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public DateTime LastUpdateAt { get; set; }

更新数据库

dotnet ef migrations add ChangeLastUpdateByToString

dotnet ef database update

启动程序,新增一条数据,可以看到创建时间,修改时间默认值

并发token

配置为并发标记的属性用于实现乐观并发控制。

数据批注

public class Person

{

public int PersonId { get; set; }

[ConcurrencyCheck]

public string LastName { get; set; }

public string FirstName { get; set; }

}

Fluent API

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity()

.Property(p => p.LastName)

.IsConcurrencyToken();

}

Timestamp/rowversion (推荐)

Timestamp/rowversion 是一个属性,在每次插入或更新行时,数据库会自动为其生成新值。 此属性也被视为并发标记,这确保了在你查询行后,如果正在更新的行发生了更改,则会出现异常。

数据批注

public class Blog

{

public int BlogId { get; set; }

public string Url { get; set; }

[Timestamp]

public byte[] Timestamp { get; set; }

}

Fluent API

class MyContext : DbContext

{

public DbSet Blogs { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity()

.Property(p => p.Timestamp)

.IsRowVersion();

}

}

public class Blog

{

public int BlogId { get; set; }

public string Url { get; set; }

public byte[] Timestamp { get; set; }

}

索引

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity()

.HasIndex(b => b.Url);

}

为多个列指定索引

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.Entity()

.HasIndex(p => new { p.FirstName, p.LastName });

}

GitHub源码链接:

efcore 实体配置_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记...相关推荐

  1. ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...

    2.4.5 EF Core -- 查询 关联数据加载 客户端与服务端运算 跟踪与不跟踪 复杂查询运算 原生 SQL 查询 全局查询筛选器 关联数据加载 学员和助教都在项目分组中,调整模型,删除 Ass ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记

    2.2.3 核心模块--配置 IConfiguration Options ASP.NET Core 中的配置:https://docs.microsoft.com/zh-cn/aspnet/core ...

  3. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...

  4. .NET 云原生架构师训练营(系统架构)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章 ...

  5. .NET 云原生架构师训练营(模块二 基础巩固 安全)--学习笔记

    2.8 安全 认证 VS 授权 ASP .NET Core 认证授权中间件 认证 JWT 认证 授权 认证 VS 授权 认证是一个识别用户是谁的过程 授权是一个决定用户可以干什么的过程 401 Una ...

  6. .NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记

    2.3.1 Web API -- REST && RESTful 什么是 REST,什么是 RESTful RESTful API 设计 RESTful 成熟度模型 什么是 REST, ...

  7. .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记

    2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记

    2.2.2 核心模块--日志 ILogger 的使用 日志的 ID 日志的分类 日志的级别 LoggerProvider 日志的最佳实践 .NET Core 和 ASP.NET Core 中的日志记录 ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

    2.2.1 核心模块--依赖注入 什么是依赖注入 .NET Core DI 生命周期 服务设计 服务范围检查 ASP.NET Core 依赖注入:https://docs.microsoft.com/ ...

最新文章

  1. Android Studio教程10-Intent的详细使用
  2. 五大HR所不认同的跳槽理由(转)
  3. 在Visual Studio 2019中修改项目名
  4. 在Java中使用Google的协议缓冲区
  5. optimize table 需要多久_吉林市政工程资质新办需要多久
  6. mysql 结果集什么意思_结果集中的mysql“和”逻辑
  7. linux media v4l2,Linux kernel drivers/media/v4l2-core/videobuf2-v4l2.c拒绝服务漏洞(CVE-2016-4568)...
  8. 入手mac后,这5个技巧和窍门你应该知道
  9. 玩转docker、Swarm、Kubernetes
  10. PySpark : Structured Streaming
  11. idea教育版增加springboot插件
  12. 混合线性模型学习笔记2
  13. 服务器大线程有什么作用,全面剖析超线程技术优点与缺点
  14. python最新抢票脚本
  15. 床帘机器人_如何打造一个更舒适更智能的大学宿舍?
  16. 《MATLAB智能算法30个案例》:第19章 基于模拟退火算法的TSP算法
  17. Service层需要接口吗
  18. 提取谷歌游览器Cookie的五重境界
  19. 信用卡还款高峰到来小心多付冤枉钱
  20. [实操]ITunes打开时报错.“如果您在 iTunes 中看到 -45054 或 -42110 错误“

热门文章

  1. HRM- Fusion体验报告
  2. 具有跳跃性思维的算法
  3. thymeleaf笔记
  4. 厦门宝讯网捷:拼多多一件代发怎么做?
  5. php算html语言吗,为何说PHP 是一种 HTML 内嵌式的语言
  6. 【Scala】Scala 部署和安装
  7. 计算机到未识别网络有个叹号,上网异常:出现黄色感叹号不能上网的两种解决方案...
  8. 整理 刘汝佳紫书第三章习题代码 未完待续
  9. python 往mysql数据库存储照片
  10. 记一次突然宕机重启服务器导致docker中redis无法启动的问题解决