|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- 安装
- ```
- 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<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){}
- ```
-
-
-
-
-
|