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

网站域名变了能查吗绵阳网站建设网站建设

网站域名变了能查吗,绵阳网站建设网站建设,小米开发者模式,什么叫网站开发应用框架前言本文主要是讲解EF Core3.0 如何实现自定义的数据库扩展函数#xff0c;虽然EF.Functions 提供了很多数据库函数,但是并不全面.比如加密解密..。这样的话 我们就需要自己扩展这些数据库函数 从而达到调用的目的.本文以达梦数据库为例(其他数据库都一样)..上篇文章推荐: EF … 前言本文主要是讲解EF Core3.0 如何实现自定义的数据库扩展函数虽然EF.Functions 提供了很多数据库函数,但是并不全面.比如加密解密..。这样的话 我们就需要自己扩展这些数据库函数 从而达到调用的目的.本文以达梦数据库为例(其他数据库都一样)..上篇文章推荐: EF Core3.0 通过拦截器实现读写分离与SQL日志记录 正文1.创建扩展方法首先我们需要创建自定义的扩展方法如下: public static class DbFunctionsExtensions{/// summary/// 调用数据库的加密方法/// /summary/// param name_/param/// param namecontext/param/// param nametypeid/param/// param namekey/param/// returns/returnspublic static string DmAlgorithmsEncrypt(this DbFunctions _, string context, int typeid, string key){throw new InvalidOperationException(该方法仅用于实体框架核心没有内存实现。);}/// summary/// 调用数据库的解密方法/// /summary/// param name_/param/// param namecontext/param/// param nametypeid/param/// param namekey/param/// returns/returnspublic static string DmAlgorithmsDecrypt(this DbFunctions _, string context, int typeid, string key){throw new InvalidOperationException(该方法仅用于实体框架核心没有内存实现。);}很简单,我们只需要定义2个静态扩展方法,并且抛出一个InvalidOperationException异常即可.2.创建调用方法转换器(IMethodCallTranslator)这里记住IMethodCallTranslator这个接口,我们需要实现它,如下: public class DmDbFunctionsTranslateImpl : IMethodCallTranslator{private readonly ISqlExpressionFactory _expressionFactory;private static readonly MethodInfo _dmAlgorithmsEncryptMethod typeof(DbFunctionsExtensions).GetMethod(nameof(DbFunctionsExtensions.DmAlgorithmsEncrypt),new[] { typeof(DbFunctions), typeof(string), typeof(int), typeof(string) });private static readonly MethodInfo _dmAlgorithmsDecryptMethod typeof(DbFunctionsExtensions).GetMethod(nameof(DbFunctionsExtensions.DmAlgorithmsDecrypt),new[] { typeof(DbFunctions), typeof(string), typeof(int), typeof(string) });public DmDbFunctionsTranslateImpl(ISqlExpressionFactory expressionFactory){_expressionFactory expressionFactory;}public SqlExpression Translate(SqlExpression instance, MethodInfo method, IReadOnlyListSqlExpression arguments){ //判断方法是否一致if (method _dmAlgorithmsEncryptMethod){var args new ListSqlExpression { arguments[1], arguments[2], arguments[3] };return _expressionFactory.Function(instance, CFALGORITHMSENCRYPT, args, typeof(string));}if (method _dmAlgorithmsDecryptMethod){var args new ListSqlExpression { arguments[1], arguments[2], arguments[3] };return _expressionFactory.Function(instance, CFALGORITHMSDECRYPT, args, typeof(string));}return null;}}3.创建调用转换器提供程序(RelationalMethodCallTranslatorProvider) public sealed class DmAlgorithmsMethodCallTranslatorPlugin : RelationalMethodCallTranslatorProvider{public DmAlgorithmsMethodCallTranslatorPlugin(RelationalMethodCallTranslatorProviderDependencies dependencies): base(dependencies){ISqlExpressionFactory expressionFactory dependencies.SqlExpressionFactory;AddTranslators(new IMethodCallTranslator[]{//这里,将刚刚的方法转换器添加到扩展new DmDbFunctionsTranslateImpl(expressionFactory)});}}这个类主要是将我们刚刚创建的方法转换器添加SQL表达式工厂(SqlExpressionFactory)当中. 4.创建DbContext扩展类(IDbContextOptionsExtension)代码如下,关键点加了注释,自行参考.. public class DmDbContextOptionsExtension : IDbContextOptionsExtension{private DbContextOptionsExtensionInfo _info;public void Validate(IDbContextOptions options){}public DbContextOptionsExtensionInfo Info{get{return this._info ?? new MyDbContextOptionsExtensionInfo(this);}}void IDbContextOptionsExtension.ApplyServices(IServiceCollection services){//这里将转换器注入到服务当中.services.AddSingletonIMethodCallTranslatorProvider, DmAlgorithmsMethodCallTranslatorPlugin();}private sealed class MyDbContextOptionsExtensionInfo : DbContextOptionsExtensionInfo{public MyDbContextOptionsExtensionInfo(IDbContextOptionsExtension instance) : base(instance) { }public override bool IsDatabaseProvider false;public override string LogFragment ;public override void PopulateDebugInfo(IDictionarystring, string debugInfo){}public override long GetServiceProviderHashCode(){return 0;}}}5.创建DbContext生成时的扩展方法 public static class DmDbContextOptionsBuilderExtensions{public static DbContextOptionsBuilder UseDmAlgorithmsEncryptionFunctions(this DbContextOptionsBuilder optionsBuilder){//将自定义的配置类添加到配置选项中var extension GetOrCreateExtension(optionsBuilder);((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension);return optionsBuilder;}//生成创建扩展类private static DmDbContextOptionsExtension GetOrCreateExtension(DbContextOptionsBuilder optionsBuilder) optionsBuilder.Options.FindExtensionDmDbContextOptionsExtension()?? new DmDbContextOptionsExtension();} 6.编写测试代码,查看使用效果我们先在数据库插入一条加密数据如下:insert into tab.tab( XingMing, ZhengJianHao, ShouJiHao) VALUES( 测试数据1, CFALGORITHMSENCRYPT(123456789,514,ABC),77777); 然后我们编写查询代码:var ddd Context.Where(a EF.Functions.DmAlgorithmsDecrypt(a.ZhengJianHao, 514, ABC)  123456789).First(); 这里,我们将数据解密后在对比查询效果如下: 我们通过监控SQL语句 可以看到如下SQL语句:  这里,已经将我们的自定义扩展函数转换成了SQL函数 并在数据库执行了.写在最后这里我们就完成了整个SQL函数的扩展. 写这篇主要是为了抛砖引玉..目前这种扩展方式,在查询的时候 可以正常的生成SQL语句,但是在ADD 和Update的时候 并不会生成对应的语句,所以想问问各位大佬,有没有更好的实现方式.
http://www.sadfv.cn/news/14288/

相关文章:

  • 莉莉卡是哪个网站做的做网站笔记本
  • 提供专业网站小程序开发在线制作图标
  • p2p视频网站建设深圳网站建设制作公司
  • 网站 域名seo优化顾问
  • 青浦网站建设 迎鑫中国建设银行 网站登录
  • 为什么不推荐免费建站wordpress 静态地址
  • 个人网站怎么做淘宝客建设工程合同性质上属于实践合同
  • 二级域名查询网站ps做网页
  • 如何建网站吗?泉州网站快速排名提升
  • 广安市网站建设互联网品牌是什么意思
  • 做调差问卷的网站重庆网络推广公司
  • 沭阳网站定制kilu wordpress安装
  • 企业做网站推广做h5的网站有哪些
  • 大渡口网站建设哪家好洛阳网
  • 网站建优化企业网站留言板
  • 网站建设和托管开发一套软件app
  • 陕西西安网站建设公司排名如何为一个网站做app
  • 湖南厦门网站优化vs网站开发表格大小设置
  • 做文案需要用到的网站哪个网站可以免费做音乐相册
  • 担保交易网站开发wordpress 插件阅读
  • 江苏省工程建设标准站网站海南招聘网
  • windows10网站建设适合程序员的wordpress主题
  • 建设配资网站有要求吗对网站建设建议
  • 企业网站建设计什么科目建设网站需要花多少钱
  • 北京天津网站建设公司专业简历制作公司
  • 律师论坛网站模板湛江网站建设方案维护
  • 襄阳网站建设营销大港天津网站建设
  • 网站建设一般需要什么功能网站怎么样被百度收录
  • 温州建校证件查询网站PHP网站开发项目式教程
  • 网站开发怎样建立后台数据宁波网站推广人