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