由于逻辑需要,我希望能在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.效果

最新文章

  1. LINQ系列:LINQ to SQL Concat/Union
  2. 2.bootstrap练习笔记-轮播图
  3. css中为了清除浮动经常用到的after样式
  4. OpenSSH后门获取root密码及防范
  5. find命令错误提示路径必须在表达式之前
  6. Orchard常见问题
  7. 理解C#系列 / 核心C# / 数据类型
  8. JAVA类与对象(一)----基础概念理解
  9. DisUnity——Unity3D反编译资源提取利刃
  10. hdu 5063 Operation the Sequence
  11. 失效的URL访问限制(转)
  12. css基础-背景文本
  13. Android的Activity屏幕切换滑动动画
  14. Battle ships(二分图,建图,好题)
  15. 文本导出到pdf文件(使用QPrinter和QPainter和QTextDocument)
  16. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
  17. 套接字工厂——ServerSocketFactory
  18. 20155324 《Java程序设计》实验四 Android开发基础
  19. set-matrix-zeroes当元素为0则设矩阵内行与列均为0
  20. MongoDB(课时22 唯一索引)

热门文章

  1. 读《Android编程权威指南》
  2. Bootstrap 中的 Typeahead 组件 -- AutoComplete
  3. Python 之旅
  4. HDU 2586
  5. javascript for循环
  6. java反射
  7. Oracle10g 表分区
  8. Windows HTTP Services
  9. Java后台发送邮件
  10. jquery 替换文本内容