安装
Install-Package Maikebing.Data.Taos
使用
string database = "db_" + DateTime.Now.ToString("yyyyMMddHHmmss");
//配置文件
var builder = new TaosConnnectionStringBuilder()
{
DataSource="rest/sql",
DataBase = database,
Username="",
Password=""
};
//创建上下文
using(var context = new TaosContext(new DbContextOptionsBuilder().UseTaos(builder.ConnectionString).Options))
{
context.Database.EnsureCreated();
context.sensor.Add(new sensor(){ts = DateTime.Now.AddMillieseconds(i), degree=rd.NextDouble(), pm25=rd.Next(0,1000)});
context.SaveChanges();
}
把所有的配置包裹在一个类中,是常规做法,这里就是TaosConnectionStringBuilder
,它继承了DbConnectionStringBuilder
,而DbConnectionStringBuilder
是System.Data.Common
中的一员。
System.Data.Common
这个命名空间的主要负责DataSet和DataSource之间的操作,无非是读和写。TDengine的 .NET Core连接器就是利用了该命名空间的工作机制完成了数据的读写,是一种非常成熟的做法,这种成熟建立在该命名空间内在机制的成熟。
System.Data.Common
主要包含了以下几个类:
通过TaosConnectionStringBuilder
传入的参数是如何被内在机制接受的呢?
通过属性赋值进来。内部对属性如何处理呢?原来,不仅交给了基类,也交给了本类的字段。
public class TaosConnectionStringBuilder : DbConnectionStringBuilder
{
//virutal意味着必须有方法体,abstract不能有方法体
//virutal可以不被子类重写,但如果子类要重写必须加上override
//abstract方法必须被子类重写
public virutal string Username
{
get {return _userName;}
set {
base[UserNameKeyword] = _userName = value;
}
}
}
TaosConnectionStringBuilder
还有一处设计很巧妙,就是通过一个静态构造函数把一个内部的枚举分别放在了只读List类型和Diction类型的集合中去了,分别是IReadOnlyList<string>
和IReadOnlyDictioanry<string, Keywords>
。静态构造函数什么时候会调用呢?就是类在第一次实例化或者访问类的静态成员的时候调用。
public class TaosConnectionStringBuilder : DbConnectionStringBuilder
{
static TasoConnectionStringBuilder()
{
}
//virutal意味着必须有方法体,abstract不能有方法体
//virutal可以不被子类重写,但如果子类要重写必须加上override
//abstract方法必须被子类重写
public virutal string Username
{
get {return _userName;}
set {
base[UserNameKeyword] = _userName = value;
}
}
}
这个连接器令人叹为观止的一点是还使用了DbContext
的内在机制针对时序数据库有了上下文,这是如何做到的呢?
--基本上扩展了Entity Framework Core
的所有方面。
IDesignTimeDbContextFactroy
这个接口用来定义在设计时,比如生成迁移文件的时候如何设置上下文。
public class SampleContextFactory : IDesignTimeDbContextFactory<SampleContext>
{
public SampleContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<SampleContext>();
optionsBuilder.UseSqlServer("",opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds));
return new SampleContext(optionsBuilder.Options);
}
}
上下文一定
public SampleContext(DbContextOptions options) : base(options){}