【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.效果
【EntityFramework Core】实体实例化注入的更多相关文章
- Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor
Webservice WCF WebApi 注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- EntityFramework Core 3.x上下文构造函数可以注入实例呢?
前言 今天讨论的话题来自一位微信好友遇到问题后请求我的帮助,当然他的意图并不是本文标题,只是我将其根本原因进行了一个概括,接下来我们一起来探索标题的问号最终的答案是怎样的呢? 上下文构造函数是否可以注 ...
- EntityFramework Core 2.0执行原始查询如何防止SQL注入?
前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramewor ...
- EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?
前言 这个问题从未遇见过,是一位前辈问我EF Core内存泄漏问题时我才去深入探讨这个问题,刚开始我比较惊讶,居然还有这种问题,然后就有了本文,直接拿前辈的示例代码并稍加修改成就了此文,希望对在自学E ...
- EntityFramework 7 更名为EntityFramework Core(预发布状态)
前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要 ...
- EntityFramework Core查询问题集锦(一)
前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...
- EntityFramework Core问题处理集锦(一)
前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
随机推荐
- JS打开新页面跳转
有时候使用js进行页面跳转,想使用 a 标签中 target="_blank" 形式,跳转打开一个新的页面. 可以使用以下脚本,创建一个 a标签,然后模拟点击操作. 代码如下: ...
- CString用法小结《转载》
http://blog.sina.com.cn/s/blog_a674ea930101aeey.html
- xampp 下安装mysql-python
pip install mysql-python修改路径PATH="$PATH":(/mysql/bin 路径)brew install mysql-connector-c
- IE浏览器版本判断 HTML代码
<!--[if IE 6.0]> <div id="noie6" style="z-index: 20002;border: 1px solid #F7 ...
- powershell例子
例子如下: $ErrorActionPreference="Stop" function getlist{ ls D:\tmp2|select name,extension,ful ...
- mkdir命令
[mkdir] 创建目录 mkdir ===make directory 命令格式: mkdir [OPTION]... DIRECTORY 命令功能: 通过 mkdir 命令可以实现在指 ...
- php关于ob_start('ob_gzhandler')启用GZIP压缩的bug
如果使用ob_start("ob_gzhandler"); 则ob_clean()后面的输出将不显示,这是个bug,可以用ob_end_clean();ob_start(" ...
- Ansible Ubuntu 安装部署
一.安装: $ sudo apt-get install ansible 二.配置: a.基本配置 $ cd /etc/ansible/ $ sudo cp hosts hosts_back 备份一个 ...
- Android RadioGroup和RadioButton详解
实现RadioButton由两部分组成,也就是RadioButton和RadioGroup配合使用.RadioGroup是单选组合框,可以容纳多个RadioButton的容器.在没有RadioGrou ...
- jeecms3.0.4版本 详解请求如何找到首页(转)
第一步:发送http://localhost:8080/emisstrade/ 请求 第二步:首先进入配置文件web.xml, <context-param> <param-name ...