翼度科技»论坛 编程开发 .net 查看内容

Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询

同样还是IModelCacheKeyFactory,不过这次要采用主动刷新的方式。
实现DbContext

动态实体,根据配置等生成动态类型来当作数据库实体使用,当配置修改时,可以调用DynamicModelCacheKeyFactory.Refresh()刷新DbContext。
动态构建部分不提供,我们将在其它的地方进行讨论。
  1. public class SampleDbContext(DbContextOptions<SampleDbContext> options)
  2.     : DbContext(options)
  3. {
  4.     protected override void OnModelCreating(ModelBuilder modelBuilder)
  5.     {
  6.         // 构建所有的FormType
  7.         FormTypeBuilderService.BuildFormTypes();
  8.         // 将Type添加到DbContext上下文
  9.         foreach (var type in FormTypeBuilderService.Value.GetModelTypes())
  10.         {
  11.             AddFormEntityType(type);
  12.         }
  13.         base.OnModelCreating(modelBuilder);
  14.         void AddFormEntityType(Type formType)
  15.         {
  16.             var entityType = modelBuilder.Model.FindEntityType(formType);
  17.             if (entityType == null)
  18.             {
  19.                 modelBuilder.Model.AddEntityType(formType);
  20.             }
  21.             modelBuilder.Entity(formType).HasBaseType((Type)null!);
  22.         }
  23.     }
  24. }
复制代码
实现IModelCacheKeyFactory

我这里做了简化处理,直接检测了当前月份的变化,也可以通过实现一个静态变量由外部动态改变。
  1. public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory
  2. {
  3.     private static Guid RefreshToken = Guid.NewGuid();
  4.     public static Guid Refresh() => Guid.NewGuid();
  5.     public object Create(DbContext context, bool designTime)
  6.     {
  7.         return DateTime.Now.ToString("yyyyMM");
  8.     }
  9. }
复制代码
替换DbContext中的默认实现
  1. services.AddDbContext<SampleDbContext>(opts =>
  2. {
  3.     opts.ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();
  4. });
复制代码
派生DbContext内置方法

实现一个DynamicSet对标Set,需要安装System.Linq.Dynamic.Core和Microsoft.EntityFrameworkCore.DynamicLinq,即可使用lambda进行拼接查询。
  1. public class SampleDbContext(DbContextOptions<SampleDbContext> options)
  2.     : DbContext(options)
  3. {
  4.     protected override void OnModelCreating(ModelBuilder modelBuilder)
  5.     {
  6.         // 构建所有的FormType
  7.         FormTypeBuilderService.BuildFormTypes();
  8.         // 将Type添加到DbContext上下文
  9.         foreach (var type in FormTypeBuilderService.Value.GetModelTypes())
  10.         {
  11.             AddFormEntityType(type);
  12.         }
  13.         base.OnModelCreating(modelBuilder);
  14.         void AddFormEntityType(Type formType)
  15.         {
  16.             var entityType = modelBuilder.Model.FindEntityType(formType);
  17.             if (entityType == null)
  18.             {
  19.                 modelBuilder.Model.AddEntityType(formType);
  20.             }
  21.             modelBuilder.Entity(formType).HasBaseType((Type)null!);
  22.         }
  23.     }
  24.     public IQueryable DynamicSet(string tableId)
  25.     {
  26.         var type = FormTypeBuilderService.GetModelType(tableId);
  27.         return (IQueryable)GetType().GetTypeInfo().GetMethod("Set", Type.EmptyTypes)!.MakeGenericMethod(type)
  28.             .Invoke(this, null)!;
  29.     }
  30. }
复制代码
来源:https://www.cnblogs.com/donpangpang/Undeclared/17940638
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具