EfDataProvider_DbSet.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.Extensions.DependencyInjection;
  3. using Newtonsoft.Json.Linq;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. using Vit.Core.Util.ComponentModel.Data;
  9. using Vit.Core.Util.ComponentModel.Query;
  10. using Vit.Core.Util.ComponentModel.SsError;
  11. using Vit.Db.Module.Schema;
  12. using Vit.Extensions;
  13. using Vit.Extensions.ObjectExt;
  14. using Vit.Linq.Query;
  15. using Vit.Orm.EntityFramework.Extensions;
  16. namespace Vit.AutoTemp.DataProvider.Ef
  17. {
  18. public class EfDataProvider<Model, DbContext> : IDataProvider
  19. where Model : class
  20. where DbContext : Microsoft.EntityFrameworkCore.DbContext
  21. {
  22. public string template { get; private set; }
  23. public bool isTree => pidField != null;
  24. public TableSchema tableSchema { get; private set; }
  25. string idField;
  26. string pidField;
  27. Type entityType;
  28. JObject controllerConfig;
  29. Func<(IServiceScope, DbContext, DbSet<Model>)> CreateDbContext;
  30. public EfDataProvider(string template, Type entityType, Func<(IServiceScope, DbContext, DbSet<Model>)> CreateDbContext) :
  31. this(template, AutoTempHelp.EfEntityToTableSchema(entityType), entityType, CreateDbContext)
  32. {
  33. }
  34. public EfDataProvider(string template, TableSchema tableSchema, Type entityType, Func<(IServiceScope, DbContext, DbSet<Model>)> CreateDbContext)
  35. {
  36. this.template = template;
  37. this.tableSchema = tableSchema;
  38. this.entityType = entityType;
  39. this.CreateDbContext = CreateDbContext;
  40. Init();
  41. }
  42. /// <summary>
  43. ///
  44. /// </summary>
  45. public void Init()
  46. {
  47. controllerConfig = AutoTempHelp.BuildControllerConfigByTable(tableSchema);
  48. idField = controllerConfig["idField"]?.Value<string>();
  49. pidField = controllerConfig["pidField"]?.Value<string>();
  50. }
  51. #region getConfig
  52. public ApiReturn getControllerConfig(object sender)
  53. {
  54. return new ApiReturn<JObject>(controllerConfig);
  55. }
  56. #endregion
  57. #region getList
  58. public ApiReturn getList(object sender, List<DataFilter> filter, IEnumerable<SortItem> sort, PageInfo page, JObject arg)
  59. {
  60. var (scope, dbContext,dbSet) = CreateDbContext();
  61. using (scope)
  62. {
  63. var queryable = dbSet.AsQueryable();
  64. var pageData = queryable.ToPageData(filter, sort, page, (object ori) => { return ori.ConvertBySerialize<JObject>(); });
  65. #region _childrenCount
  66. if (isTree)
  67. {
  68. var tasks = pageData.rows.Select(async m =>
  69. {
  70. var filters = new[] { new DataFilter { field = pidField, opt = "=", value = m[idField].GetValue() } };
  71. var count = await queryable.IQueryable_Where(filters).Ef_CountAsync();
  72. m["_childrenCount"] = count;
  73. });
  74. Task.WaitAll(tasks.ToArray());
  75. }
  76. #endregion
  77. return new ApiReturn<object> { data = pageData };
  78. }
  79. }
  80. #endregion
  81. #region getModel
  82. public ApiReturn getModel(object sender, string id)
  83. {
  84. var (scope, dbContext, dbSet) = CreateDbContext();
  85. using (scope)
  86. {
  87. var queryable = dbSet.AsQueryable();
  88. queryable = queryable.Where(new[] { new DataFilter { field = idField, opt = "=", value = id } });
  89. return new ApiReturn<object> { data = queryable.FirstOrDefault() };
  90. }
  91. }
  92. #endregion
  93. #region insert
  94. public ApiReturn insert(object sender, JObject model)
  95. {
  96. var userModel = model.ConvertBySerialize(entityType);
  97. var (scope, dbContext, dbSet) = CreateDbContext();
  98. using (scope)
  99. {
  100. dbContext.Add(userModel);
  101. dbContext.SaveChanges();
  102. }
  103. return new ApiReturn<object>(userModel);
  104. }
  105. #endregion
  106. #region update
  107. public ApiReturn update(object sender, JObject model)
  108. {
  109. var userModel = model.ConvertBySerialize(entityType);
  110. var (scope, dbContext, dbSet) = CreateDbContext();
  111. using (scope)
  112. {
  113. var queryable = dbSet.AsQueryable();
  114. var entity = queryable
  115. .Where(new[] { new DataFilter { field = idField, opt = "=", value = model[idField] } })
  116. .FirstOrDefault();
  117. if (entity == null)
  118. {
  119. return new SsError
  120. {
  121. errorMessage = "待修改的数据不存在"
  122. };
  123. }
  124. entity.CopyNotNullProrertyFrom(userModel);
  125. dbContext.Update(entity);
  126. dbContext.SaveChanges();
  127. return new ApiReturn<object> { data = entity };
  128. }
  129. }
  130. #endregion
  131. #region delete
  132. public ApiReturn delete(object sender, JObject arg)
  133. {
  134. var (scope, dbContext, dbSet) = CreateDbContext();
  135. using (scope)
  136. {
  137. var queryable = dbSet.AsQueryable();
  138. var entity = queryable
  139. .Where(new[] { new DataFilter { field = idField, opt = "=", value = arg["id"].GetValue() } })
  140. .FirstOrDefault();
  141. if (entity == null)
  142. {
  143. return new SsError
  144. {
  145. errorMessage = "数据不存在"
  146. };
  147. }
  148. dbContext.Remove(entity);
  149. dbContext.SaveChanges();
  150. return new ApiReturn();
  151. }
  152. }
  153. #endregion
  154. }
  155. }