数据库组件
# 敢为公共库
敢为公共库数据库组件介绍
# 配置模型
模型必须通过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");