efcore 实体配置_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记...
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 基础与配置)--学习笔记...相关推荐
- ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...
2.4.5 EF Core -- 查询 关联数据加载 客户端与服务端运算 跟踪与不跟踪 复杂查询运算 原生 SQL 查询 全局查询筛选器 关联数据加载 学员和助教都在项目分组中,调整模型,删除 Ass ...
- .NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记
2.2.3 核心模块--配置 IConfiguration Options ASP.NET Core 中的配置:https://docs.microsoft.com/zh-cn/aspnet/core ...
- .NET 云原生架构师训练营(设计原则设计模式)--学习笔记
▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...
- .NET 云原生架构师训练营(系统架构)--学习笔记
▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章 ...
- .NET 云原生架构师训练营(模块二 基础巩固 安全)--学习笔记
2.8 安全 认证 VS 授权 ASP .NET Core 认证授权中间件 认证 JWT 认证 授权 认证 VS 授权 认证是一个识别用户是谁的过程 授权是一个决定用户可以干什么的过程 401 Una ...
- .NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记
2.3.1 Web API -- REST && RESTful 什么是 REST,什么是 RESTful RESTful API 设计 RESTful 成熟度模型 什么是 REST, ...
- .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记
2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...
- .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记
2.2.2 核心模块--日志 ILogger 的使用 日志的 ID 日志的分类 日志的级别 LoggerProvider 日志的最佳实践 .NET Core 和 ASP.NET Core 中的日志记录 ...
- .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记
2.2.1 核心模块--依赖注入 什么是依赖注入 .NET Core DI 生命周期 服务设计 服务范围检查 ASP.NET Core 依赖注入:https://docs.microsoft.com/ ...
最新文章
- Android Studio教程10-Intent的详细使用
- 五大HR所不认同的跳槽理由(转)
- 在Visual Studio 2019中修改项目名
- 在Java中使用Google的协议缓冲区
- optimize table 需要多久_吉林市政工程资质新办需要多久
- mysql 结果集什么意思_结果集中的mysql“和”逻辑
- linux media v4l2,Linux kernel drivers/media/v4l2-core/videobuf2-v4l2.c拒绝服务漏洞(CVE-2016-4568)...
- 入手mac后,这5个技巧和窍门你应该知道
- 玩转docker、Swarm、Kubernetes
- PySpark : Structured Streaming
- idea教育版增加springboot插件
- 混合线性模型学习笔记2
- 服务器大线程有什么作用,全面剖析超线程技术优点与缺点
- python最新抢票脚本
- 床帘机器人_如何打造一个更舒适更智能的大学宿舍?
- 《MATLAB智能算法30个案例》:第19章 基于模拟退火算法的TSP算法
- Service层需要接口吗
- 提取谷歌游览器Cookie的五重境界
- 信用卡还款高峰到来小心多付冤枉钱
- [实操]ITunes打开时报错.“如果您在 iTunes 中看到 -45054 或 -42110 错误“