using System; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Net.Mime; using BITKit; using Cysharp.Threading.Tasks; using Godot; using Microsoft.EntityFrameworkCore; namespace BITFactory; // ReSharper disable once IdentifierTypo [Serializable] public abstract class IDIS_Base { /// /// 创建时间 /// public DateTime CreateDate { get; set; }=DateTime.Now; /// /// 更新时间 /// public DateTime UpdateDate { get; set; }=DateTime.Now; } // ReSharper disable once IdentifierTypo /// /// 标识的值 /// [Serializable] public class IDIS_Value:IDIS_Base { /// /// 标识码 /// [Key] public string Handle { get; set; } } // ReSharper disable once IdentifierTypo public class IDIS_Query : IDIS_Value { // ReSharper disable once IdentifierTypo /// /// 关联的数据 /// public IDIS_Data[] Datas { get; internal set; } // ReSharper disable once IdentifierTypo /// /// 关联的标识引用 /// public IDIS_Reference[] References { get; internal set; } } /// /// 标识的格式 /// [Serializable] // ReSharper disable once IdentifierTypo public class IDIS_Data:IDIS_Base { /// /// 不需要处理这个 /// [Key] public int Index { get; set; } /// /// 标识码 /// public string Handle { get; set; } /// /// 值类型,例如string,url,site /// public string Format { get; set; } /// /// 值 /// public string Value { get; set; } } /// /// 标识的引用或关联 /// [Serializable] // ReSharper disable once IdentifierTypo public class IDIS_Reference:IDIS_Base { /// /// 不需要处理这个 /// [Key] public int Index{ get; set; } /// /// 标识码 /// public string Handle { get; set; } /// /// 相关联的标识 /// public string RelatedHandle { get; set; } } // ReSharper disable once IdentifierTypo public class IDIS_DBContext:DbContext { /// /// 标识表 /// private DbSet Values { get; set; } /// /// 标识数据表 /// private DbSet Datas{ get; set; } /// /// 标识引用表 /// private DbSet References{ get; set; } /// /// 确保创建数据库 /// /// protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // ReSharper disable once StringLiteralTypo //var sql = SQLiteContextHelper.GetConnectionString("IDIS"); SQLiteContextHelper.GetConnectionSqlAndPath("IDIS",out var sql,out var path); optionsBuilder.UseSqlite(sql); BIT4Log.Log($"已创建标识数据库:{path}"); } /// /// 查询多个标识 /// /// 模糊标识码 /// 查询列表 /// 是否查询到了内容 public bool Query(string key, out IDIS_Query[] queries) { var _query = Values.Where(x => x.Handle.Contains(key)); var result = _query.Select(x=>new IDIS_Query() { Handle = x.Handle, CreateDate = x.CreateDate, UpdateDate = x.UpdateDate, Datas = Datas.Where(data=>data.Handle == key).ToArray(), References = References.Where(reference=>reference.Handle == key).ToArray() }); queries = result.ToArray(); return result.Any(); } /// /// 查询单个标识 /// /// 模糊标识 /// 标识查询结果 /// 是否查询到了标识 public bool Query(string key, out IDIS_Query query) { Query(key, out IDIS_Query[] queries); query = queries.FirstOrDefault(); var 温度 = Datas //查询相关的标识 .Where(x => x.Handle == "MyHandle") .OrderBy(x=>x.CreateDate) //从标识中查找"MyFormat" .First(x => x.Format == "Temperature").Value; return queries.Any(); } public bool Register(string handle) { var handleExists = Values.Any(x => x.Handle == handle); if (handleExists) { return false; } var value = new IDIS_Value() { Handle = handle }; Values.Add(value); SaveChanges(); return true; } public void Register(string handle,string format, string value) { var handleExists = Values.Any(x => x.Handle == handle); if (!handleExists) { Register(handle); } var data = new IDIS_Data() { Handle = handle, Format = format, Value = value }; Datas.Add(data); SaveChanges(); } public void RegisterReference(string handle, string refenceHandle) { References.Add(new IDIS_Reference() { Handle = handle, RelatedHandle = refenceHandle, }); SaveChanges(); } } // ReSharper disable once IdentifierTypo /// /// 标识码注册与查询服务 /// public partial class IDIS_Service:Node { private static IDIS_DBContext Context; public override void _Ready() { Context = new IDIS_DBContext(); BIT4Log.Log("已创建标识数据库"); UniTask.Run(()=>Context.Database.EnsureCreatedAsync()); } public bool Register(string handle) => Context.Register(handle); public void Register(string handle, string format, string value) => Context.Register(handle, format, value); public void RegisterReference(string handle,string refenceHandle) => Context.RegisterReference(handle,refenceHandle); public static string GenerateHandle() => $"88.123.99/{Mathf.Abs(Guid.NewGuid().GetHashCode())}"; }