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

13 篇文章 0 订阅
11 篇文章 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)!;
    }
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖纸不争

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值