Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询
  9JriZXzjEcmS 2024年01月08日 21 0

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

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

实现DbContext

动态实体,根据配置等生成动态类型来当作数据库实体使用,当配置修改时,可以调用DynamicModelCacheKeyFactory.Refresh()刷新DbContext。

动态构建部分不提供,我们将在其它的地方进行讨论。

public class SampleDbContext(DbContextOptions<SampleDbContext> options)
    : DbContext(options)
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 构建所有的FormType
        FormTypeBuilderService.BuildFormTypes();

        // 将Type添加到DbContext上下文
        foreach (var type in FormTypeBuilderService.Value.GetModelTypes())
        {
            AddFormEntityType(type);
        }

        base.OnModelCreating(modelBuilder);

        void AddFormEntityType(Type formType)
        {
            var entityType = modelBuilder.Model.FindEntityType(formType);
            if (entityType == null)
            {
                modelBuilder.Model.AddEntityType(formType);
            }
            modelBuilder.Entity(formType).HasBaseType((Type)null!);
        }
    }
}

实现IModelCacheKeyFactory

我这里做了简化处理,直接检测了当前月份的变化,也可以通过实现一个静态变量由外部动态改变。

public class DynamicModelCacheKeyFactory : IModelCacheKeyFactory
{
    private static Guid RefreshToken = Guid.NewGuid();

    public static Guid Refresh() => Guid.NewGuid(); 

    public object Create(DbContext context, bool designTime)
    {
        return DateTime.Now.ToString("yyyyMM");
    }
}

替换DbContext中的默认实现

services.AddDbContext<SampleDbContext>(opts =>
{
    opts.ReplaceService<IModelCacheKeyFactory, DynamicModelCacheKeyFactory>();
});

派生DbContext内置方法

实现一个DynamicSet对标Set<T>,需要安装System.Linq.Dynamic.CoreMicrosoft.EntityFrameworkCore.DynamicLinq,即可使用lambda进行拼接查询。

public class SampleDbContext(DbContextOptions<SampleDbContext> options)
    : DbContext(options)
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 构建所有的FormType
        FormTypeBuilderService.BuildFormTypes();

        // 将Type添加到DbContext上下文
        foreach (var type in FormTypeBuilderService.Value.GetModelTypes())
        {
            AddFormEntityType(type);
        }

        base.OnModelCreating(modelBuilder);

        void AddFormEntityType(Type formType)
        {
            var entityType = modelBuilder.Model.FindEntityType(formType);
            if (entityType == null)
            {
                modelBuilder.Model.AddEntityType(formType);
            }
            modelBuilder.Entity(formType).HasBaseType((Type)null!);
        }
    }

    public IQueryable DynamicSet(string tableId)
    {
        var type = FormTypeBuilderService.GetModelType(tableId);
        return (IQueryable)GetType().GetTypeInfo().GetMethod("Set", Type.EmptyTypes)!.MakeGenericMethod(type)
            .Invoke(this, null)!;
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年01月08日 0

暂无评论

推荐阅读
  NPQODODLqddb   2024年05月17日   69   0   0 .NET
  mVIyUuLhKsxa   2024年05月17日   52   0   0 .NET
  XkHDHG7Y62UM   2024年05月17日   45   0   0 .NET
  f18CFixvrKz8   2024年05月18日   85   0   0 .NET
  rBgzkhl6abbw   2024年05月18日   77   0   0 .NET
  MYrYhn3ObP4r   2024年05月17日   41   0   0 .NET
  S34pIcuyyIVd   2024年05月17日   60   0   0 .NET
  gKJ2xtp6I8Y7   2024年05月17日   50   0   0 .NET
  MYrYhn3ObP4r   2024年05月17日   39   0   0 .NET
9JriZXzjEcmS