开发者中心 开发者中心
  • 简体中文
  • English
视频教程
敢为云网站
  • 6.0版本
  • 6.1 版本
视频教程
敢为云网站
  • 平台概述
  • 平台功能
  • 平台安装
  • 开发者指南
  • 项目实战
  • 附录
    • 常用协议说明
    • 接口说明
    • 数据库说明
    • 平台接入能力
    • 如何使用gRPC
    • 敢为公共库
      • 日志组件
      • 数据库组件
        • 配置模型
        • 动态表映射配置
        • 构建容器
        • 实例化上下文
        • 上下文操作
        • SQL语句操作(上下文扩展方法中)
      • TCP公共库
      • Http公共库
    • 设备禁用配置
    • 内网平台获取外网平台数据
    • 工程调试
    • Q&A

数据库组件

# 敢为公共库

敢为公共库数据库组件介绍

# 配置模型

模型必须通过IoTEntity特性标识

[IoTEntity]
public class Test
{
     [Key]
     public int Id { get; set; }
     public string UserId { get; set; }
     public string Name { get; set; }
}

EF Core提供注解和Fluent APi配置映射,比如上述用注解[Key]来标识主键,大部分情况下都可以使用注解来完成映射,但在有些情况下,EF Core不支持通过注解映射,比如联合主键,此时通过Fluent APi即实现IEntityTypeConfiguration(EF Core内置APi)接口来配置映射

比如,如下映射配置Id和UserId作为联合主键

public class TestEntityTypeConfiguration : IEntityTypeConfiguration<Test>
{
     public void Configure(EntityTypeBuilder<Test> builder)
     {
          builder.HasKey(k => new { k.Id, k.UserId });
     }
}

注:若同一列既通过注解也通过Fluent APi配置了映射,虽不会报错,但Fluent APi会覆盖注解映射配置

# 动态表映射配置

注:仅支持按天生成,例如:zzcurvedata20210315 {#注仅支持按天生成例如zzcurvedata20210315 .list-paragraph}

注:非动态表,禁止表名以动态表生成标识"IDENTITIES"命名

[IoTEntity]

public class CurveDataTableRow
{
     [Key]
     [Required]
     [Display(Name = "key")]
     public Int64 key { get; set; }
     [Display(Name = "历史数据")]
     public byte[] curvedata { get; set; }
     [Display(Name = "保留字段1")]
     public string Reserve1 { get; set; }
     [Display(Name = "保留字段2")]
     public string Reserve2 { get; set; }
     [Display(Name = "保留字段3")]
     public string Reserve3 { get; set; }
}
public class TestEntityTypeConfiguration : IEntityTypeConfiguration<Test>
{
     public void Configure(EntityTypeBuilder<Test> builder)
     {
          //注:CustomTable.Identifies作为动态表标识
          //注:zzcurvedata作为表前缀
          builder.ToTable($"{CustomTable.Identifies}zzcurvedata");
          builder.HasKey(k => new { k.Id, k.UserId });
     }
}

# 构建容器

var serviceProvider = IoTEfCore.Initial(Assembly assembly);

方法参数为模型所在程序集,将扫描该程序集所有IoTEntity特性标识并注册模型。第一次调用该方法后,会将程序集和方法返回的容器进行缓存,所以无需调用多次。注:从该方法参数可知,所有模型必须从属于同一程序集。一个程序集对应一个容器,所以将返回容器应定义为程序集内全局变量。

# 实例化上下文

从上述所构建的全局容器中创建作用域并初始化上下文。注:一定要加上using,保证出此作用域后,上下文能立马得到释放

using (var scope = serviceProvider.CreateScope())
{
     var context = scope.ServiceProvider.GetService<IoTDbContext>();
}

# 上下文操作

在上述作用域内,从容器中获取到的上下文,通过context.Set<T>()获取模型DbSet属性,T为用IoTEntity特性所标识的模型

# SQL语句操作(上下文扩展方法中)

Execute/ExecuteAsync:增、删、修改

例如:context.Execute("insert into test(id) values(1)");

ExecuteScalar/ExecuteScalarAsync:查询单个值

例如:context.ExecuteScalar("select max(id) from test");

Query/QueryAsync:查询集合

例如:context.Query("select * from test");

QueryFirstOrDefault/QueryFirstOrDefaultAsync:查询单行记录

例如:context.QueryFirstOrDefault("select * from test where id = 1");

上次更新: 12/28/2022, 5:43:44 PM

← 日志组件 TCP公共库→

目录
配置模型
动态表映射配置
构建容器
实例化上下文
上下文操作
SQL语句操作(上下文扩展方法中)
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式