安装 ``` 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`主要包含了以下几个类: - DbConnectionStringBuilder: 专门用来处理连接字符串 - DbConnection:DataSet和DataSource之间的连接 - DbCommand:可以理解为sql语句或者存储过程 - DbParameter和DbParameterCollection:理解成DbCommand所需要的参数 - DbDataReader:负责从DataSource中读取数据。 - DbTransaction:可能是DbDataReader和DbCommand的封装 **通过`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`和`IReadOnlyDictioanry`。静态构造函数什么时候会调用呢?就是类在第一次实例化或者访问类的静态成员的时候调用。 ``` 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 { public SampleContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseSqlServer("",opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(10).TotalSeconds)); return new SampleContext(optionsBuilder.Options); } } ``` 上下文一定 ``` public SampleContext(DbContextOptions options) : base(options){} ```