当前位置: 首页 > news >正文

【EntityFramework Core】实体实例化注入

由于逻辑需要,我希望能在EF Core实例化实体时,拿到实体并执行相关代码,所以我就研究了一番EF Core,得到以下方法。

1.创建实体初始化类,继承EntityMaterializerSource

    public class ComBoostEntityMaterializerSource : EntityMaterializerSource
    {
        public ComBoostEntityMaterializerSource(IMemberMapper memberMapper) : base(memberMapper)
        {}
    }

这个类是,我们需要注入到EF Core当中去的。

2.创建EF Core扩展

    public class ComBoostOptionExtension : IDbContextOptionsExtension
    {
        public void ApplyServices(IServiceCollection services)
        {
            services.AddScoped<IEntityMaterializerSource, ComBoostEntityMaterializerSource>();
        }
    }

创建扩展后,在ApplyServices里注入我们创建的初始化类。

3.用于实例化DbContext时的DbContextOptions参数,需要添加我们创建的扩展

new DbContextOptionsBuilder<DataContext>().UseSqlServer(Configuration.GetConnectionString("DataContext")).Options.WithExtension(new ComBoostOptionExtension()))

4.重写我们的实体初始化类

    public class ComBoostEntityMaterializerSource : EntityMaterializerSource
    {
        public ComBoostEntityMaterializerSource(IMemberMapper memberMapper, CurrentDatabaseContext current) : base(memberMapper)
        {
//已注入的,用于业务的获取当前数据库上下文的类 _database = current.Context; } private IDatabaseContext _database;
//创建实例化实体的表达式 public override Expression CreateMaterializeExpression(IEntityType entityType, Expression valueBufferExpression, int[] indexMap = null) {
//获取基类实例化表达式 BlockExpression expression = (BlockExpression)base.CreateMaterializeExpression(entityType, valueBufferExpression, indexMap);
//业务逻辑判断是否是我需要更改的实体 if (typeof(IEntity).IsAssignableFrom(entityType.ClrType)) { var entityContext = _database.GetDynamicContext(entityType.ClrType);
//属性表达式 var property = Expression.Property(expression.Variables[0], typeof(IEntity).GetProperty("EntityContext"));
//赋值表达式 var assign = Expression.Assign(property, Expression.Constant(entityContext));
//把几类的实例化表达式变成列表方便插入 var list = expression.Expressions.ToList();
//因为最后一个表达式是返回实体实例
//所以我们的逻辑代码要放在最后一条语句之前 list.Insert(list.Count - 1, assign);
//重新生成表达式 expression = Expression.Block(expression.Variables, list); } return expression; } }

 

下面是效果展示

1.User类有一个显式实现的属性

2.正常赋值

3.注入后

4.效果

 

转载于:https://www.cnblogs.com/Kation/p/efcore_entity_init_inject.html

相关文章:

  • apiCloud中的API对象
  • 静态链接
  • 多大开始玩EV3
  • HTTP/2探索第一篇——概念
  • Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
  • (BFS)hdoj2377-Bus Pass
  • 最少交换次数
  • 团队作业三之问题解答
  • srand()、rand()、time()函数的用法
  • 更改pip源至国内镜像,显著提升下载速度(转载)
  • 如何用distinct消除重复记录的同时又能选取多个字段值?
  • JavaScript之继承(原型链)
  • 21、JavaScript加强
  • linux uart驱动——相关数据结构以及API(二)
  • 放课后的约定
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CentOS7 安装JDK
  • Cookie 在前端中的实践
  • ECS应用管理最佳实践
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • git 常用命令
  • Github访问慢解决办法
  • Hexo+码云+git快速搭建免费的静态Blog
  • Mac转Windows的拯救指南
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Odoo domain写法及运用
  • rc-form之最单纯情况
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SQL 难点解决:记录的引用
  • storm drpc实例
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 程序员最讨厌的9句话,你可有补充?
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 码农张的Bug人生 - 见面之礼
  • 数组的操作
  • 算法之不定期更新(一)(2018-04-12)
  • 项目管理碎碎念系列之一:干系人管理
  • 异步
  • elasticsearch-head插件安装
  • 阿里云服务器购买完整流程
  • 交换综合实验一
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #Z0458. 树的中心2
  • $(selector).each()和$.each()的区别
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四)JPA - JQPL 实现增删改查
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .Net IOC框架入门之一 Unity
  • .net 获取url的方法