1.定义EF拦截器,截获执行命令前的操作。修改执行sql。还需要定义orcal序列,供自增使用

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity.Infrastructure.Interception;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
/*
* CREATE SEQUENCE "SQ_IHR_ID" INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE;
*/ namespace TechFancier.Data
{ public class NoLockInterceptor : DbCommandInterceptor
{
static bool isDebug = false;
static NoLockInterceptor()
{
isDebug = System.Configuration.ConfigurationManager.AppSettings["DBDebug"] == "true";
} private static readonly Regex _tableAliasRegex =
new Regex(@"(?<tableAlias>AS \[Extent\d+\](?! WITH \(NOLOCK\)))",
RegexOptions.Multiline | RegexOptions.IgnoreCase); [ThreadStatic]
public static bool SuppressNoLock; public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
base.NonQueryExecuting(ReformerSql(command), interceptionContext);
} public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
base.ScalarExecuting(ReformerSql(command), interceptionContext);
} public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
base.ReaderExecuting(ReformerSql(command), interceptionContext);
}
//测试用
static System.IO.StreamWriter sw = new System.IO.StreamWriter("c.txt", true, Encoding.Default);
static void writeLog(string msg)
{
if (isDebug)
{
sw.WriteLine("[{0}][{1}]:{2}", System.Threading.Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msg);
sw.Flush();
}
}
protected DbCommand ReformerSql(DbCommand command)
{
writeLog("原始语句:" + command.CommandText);
StringBuilder sb = new StringBuilder();
foreach (DbParameter item in command.Parameters)
{
if (item != null)
sb.AppendFormat("key:{0} value:{1} valueType:{2} ", item.ParameterName, item.Value, item.Value == null ? "" : item.Value.GetType().Name);
} writeLog("参数:" + sb);
if (command.CommandText.Contains("create table"))
{//处理C#与orcal字符串不兼容的问题。
command.CommandText = command.CommandText.Replace("\" nclob", "\" varchar2(1000)");
}
//判断执行语句是否为插入语句(是)
if (command.CommandText.IndexOf("insert into", StringComparison.InvariantCultureIgnoreCase) >= )
{
string match = @"insert into ""\w+"".""\w+""\(";
string match2 = @""".""\w+""\(""";
//判断插入语句中是否包括插入Id字段(否)
if (command.CommandText.IndexOf("\"Id\",") < )
{
string val = Regex.Match(command.CommandText, match).Value;
string obj = Regex.Match(command.CommandText, match2).Value;
string table = obj.Substring(, obj.Length - );
//如果表名是Hrmanagers,FunMenu,则不需要做任何处理,因为它在插入的时候已经带上了User_Id
if (table != "HrManagers" && !table.Contains("FunMenu"))
{
command.CommandText = command.CommandText.Replace(val, val + "\"Id\", ");
command.CommandText = command.CommandText.Replace("values (", "values (SQ_IHR_ID.NEXTVAL, ");
writeLog("修改后的语句:" + command.CommandText);
}
return command; }
}
return command;
}
}
}
//
//command.CommandText = command.CommandText.Replace("values (", "values (\"SQ_" + table + "_Id\".NEXTVAL, ");

2.在合适的位置注入拦截器

                System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new NoLockInterceptor());

Orcal数据库,使用EF的自增处理的更多相关文章

  1. Entity - 使用EF框架进行增删改查 - 模型先行

    模型先行:先创建数据库实体模型,然后再进行数据库的增删改查. 基本步骤是不变的,可参照 <Entity - 使用EF框架进行增删改查 - 数据库先行> 其中的不同是,在创建数据库实体模型的 ...

  2. (18)ASP.NET Core 基于现有数据库创建EF模型(反向工程)

    1.简介 Entity Framework Core可通过数据库提供给应用程序的插件访问许多不同的数据库.我们可以通过使用Entity Framework Core构建执行基本数据访问的ASP.NET ...

  3. Codesmith怎么判断sqlserver数据库字段是不是标识自增字段

    Codesmith怎么判断sqlserver数据库字段是不是标识自增字段 使用ExtendedProperty扩展信息判断 CS_isIdentity:是否为标识符,不支持Access CS_isCo ...

  4. VS2012、2013使用Mysql数据库创建EF的AOD.NET实体模型

    VS2012.2013使用Mysql数据库创建EF的AOD.NET实体模型: 1.关闭VS,首先安装mysql-connector-net-6.8.3.(安装后EF创建实体模型时就可以找到Mysql的 ...

  5. 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

    一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...

  6. Orcal数据库12c安装完成后注意事项

    1.按照12c的安装使用装完数据库后,使用navicat链接orcal数据库时无法使用. 点击此处查看安装方案 2. 2048错误,ORA-28040: No matching authenticat ...

  7. 用CI框架向数据库中实现简单的增删改查

    以下代码基于CodeIgniter_2.1.3版 用PHP向数据库中实现简单的增删改查(纯代码)请戳 http://www.cnblogs.com/corvoh/p/4641476.html Code ...

  8. orcal数据库得连接必须用localhost,url中不要用127.0.0.1,不然无法连接

    orcal数据库得连接必须用localhost,url中不要用127.0.0.1,不然无法连接,

  9. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  10. [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]

    [Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...

随机推荐

  1. 安装微软dynamics AX2012R3-AOS(含域服务器的安装)

    安装之前首先要确保硬盘可用量>60G,内存要在7G及以上,我是在Mac里装的虚拟机,分配了7G内存(我的电脑总共才8G),编译CIL内存占用到了98% 一.Server 2016新建域控服务器 ...

  2. C语言初学

    输出控制符 输出控制符 含义 %d int 整型数 %ld long int %c char 一个字符 %f float 浮点数,整数/整数=整数,整数/小数=小数 %lf double %x %X ...

  3. hibernate原生sql封装,报错信息:could not find setter for rownum_

    今天用hibernate的时候,用了一个原生态sql做了一个分页查询,结果就报错了... 找到解决方法了:http://shmily2038.iteye.com/blog/1704963

  4. Python远程连接主机之paramiko模块

    Python的paramiko模块能够连接远程主机,并在该主机上执行命令,和该主机之间进行文件传输.paramiko支持用明文密码登录远程主机和秘钥登录.使用之前要安装一下这个模块哈,pip inst ...

  5. kafka报错处理

    Kafka报错处理 1.   记一次kafka报错处理   Kafka停止后,再启动的时候发生了报错: [2017-10-27 09:43:18,313] INFO Recovering unflus ...

  6. 基于Java的简易表达式解析工具(二)

    之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...

  7. haml参考大全

    原文来自: http://blackanger.blog.51cto.com/140924/47642   Haml是一种用来描述任何XHTML web document的标记语言,它是干净,简单的. ...

  8. 【起】ACM类下为过往所做过的部分算法题目

    [起]ACM类下为过往所做过的部分算法题目 几百道题,日后细细品味.

  9. [转]How to tell NLog to log exceptions?

    本文转自:https://stackoverflow.com/questions/9199073/how-to-tell-nlog-to-log-exceptions 问: Target: <t ...

  10. [转]SQL Server 2008- Get table constraints

    本文转自:https://stackoverflow.com/questions/14229277/sql-server-2008-get-table-constraints You should u ...