概要

Oracle 和EF 一起用的时候总会有各种问题,这里总结一下解决办法。

模式 Schema

用过Oracle的人应该知道,其实Oracle的用户名一般就是它的模式名称,如果你在用database first 模式构建edmx文件,那么恭喜你,一旦你换了用户名就会出错!

所以尽量避免用edmx来配合使用,推荐用model first模式,就是改了数据结构,自己把对应的模型也改了。

在这个时候,还是避免不了模式问题,这里提供一个办法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//模式调整
modelBuilder.HasDefaultSchema(GetSchemaByConName(ConnectionName));
}

这样就根据数据库连接字符串来初始化模式,避免被模式坑了。

表和列名大写

Oracle 的表名和列名默认都是大写的,区分大小写,当初遇到的时候可是把我坑的好惨。。。

后面找到方法将 所有列名(属性名),表名全部转换为大写,添加统一的映射。

        /// <summary>
/// create
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//表名调整
modelBuilder.Types().Configure(x => x.ToTable(EFStartup.SetTableName(x.ClrType.Name))); if (IsOracleDb)
{
//模式调整
modelBuilder.HasDefaultSchema(EFStartup.GetSchemaByConName(ConnectionName));
//列名调整
modelBuilder.Properties().Configure(c => c.HasColumnName(c.ClrPropertyInfo.Name.ToUpper()));
}
}

    /// <summary>
/// EF预热
/// </summary>
internal static class EFStartup
{
/// <summary>
/// 通过数据库连接名称获取模式名称(Oracle用)
/// </summary>
/// <param name="conName"></param>
/// <returns></returns>
internal static string GetSchemaByConName(string conName)
{
if (string.IsNullOrEmpty(conName)) throw new ArgumentNullException(nameof(conName));
var c = ConfigurationManager.ConnectionStrings[conName];
if (c == null)
throw new InvalidOperationException("Db Connection Not Found :" + conName);
if (string.IsNullOrEmpty(c.ConnectionString))
throw new Exception($"ConnectionString {conName} is empty!");
//获取User Id
var sp = c.ConnectionString.Split(';');
var u = sp.Where(x => !string.IsNullOrEmpty(x) && x.Contains("=")).FirstOrDefault(y => y.Trim().ToLower().StartsWith("user"));
if (u == null)
throw new Exception($"ConnectionString {conName} is invalid !");
sp = u.Split('=');
return sp[1].Trim().ToUpper();
} /// <summary>
/// 调整表名称
/// </summary>
/// <param name="tableName"></param>
/// <returns></returns>
public static string SetTableName(string tableName)
{
var n2 = tableName.Replace("Ms", "Mon_");
if (n2.EndsWith("History"))
n2 = n2.Replace("History", "His"); n2 = n2.ToUpper();
return n2;
}
}

通过这个设定,可以把所有实体的名字变成大写,并且可以根据需要增加前缀等,另外把实体模型的所有字段都改成大写,这样就不用纠结那些破事了。

Oracle与EntityFramework(EF)的一些事情的更多相关文章

  1. Could not load file or assembly ‘ Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342’ or one of its dependencies系统找不到指定文件 处理方法

    前些天做EF Model-First测试,开发环境为VS2013,数据库为Oracle 11g.所有东西都装好数据模型已经建立后准备执行“根据模型生成数据库”命令时,出现:Could not load ...

  2. [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作

    基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作  转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...

  3. 基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作

    目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成方便的也就当属EntityFramework(以下简称EF,不知道为什么,总EF这个缩写好不专业).但是,好多公司使用的又是ORA ...

  4. 基于Oracle的EntityFramework的WEBAPI2的实现(二)——使用DbFirst

    之所以使用DbFirst而没有使用CodeFirst是因为考虑到现实的情况中,我们之所以会选择oracle而不是SQL SERVER,一方面是因为之前公司已经在使用Oracle,而且有好多我们需要用到 ...

  5. MVC之实体框架(数据持久化框架)EntityFrameWork(EF)

    EF - EntityFrameWork 中文名:实体框架(数据持久化框架) 1.使用EF查询(Linq to EF) 1.1使用标准查询运算符来查询 OumindBlogEntities db = ...

  6. Oracle数据库用EF操作的示例

    Using EF Oracle Sample Provider with EDM Designer  (from msdn) Many people are asking if it is possi ...

  7. EntityFramework ,ef 介绍

    EntityFramework之领域驱动设计实践 分层架构 在引入实例以前,我们有必要回顾,并进一步了解分层架构.“层”是一种体系结构模式[POSA1],也是被广大软件从业人员用得最为广泛而且最为灵活 ...

  8. EntityFramework(EF)贪婪加载和延迟加载的选择和使用

    贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in co ...

  9. Oracle数据库PL/SQL那点事情---修改过电脑的用户名

    在安装Oracle数据库的PL/SQL工具时候,电脑名称是重装系统后自动生成的用户名名称,作为程序员,有很强的强迫症,就想利用自己的英文名称作为自己电脑的名称,所以就修改了电脑的名称:结果PL/SQL ...

随机推荐

  1. 深度学习(十) GoogleNet

    GoogLeNet Incepetion V1 这是GoogLeNet的最早版本,出现在2014年的<Going deeper with convolutions>.之所以名为“GoogL ...

  2. JS 开发者必须知道的十个 ES6 新特性

    这篇文章会给你简单介绍一下ES6.如果你还不知道什么是ES6的话,它是JavaScript一个新的实现,如果你是一个忙碌的JavaScript开发者(但谁不是呢),那么继续读下去吧,看看当今最热门的语 ...

  3. (最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括

    一.Xpath 解析   xpath:是一种在XMl.html文档中查找信息的语言,利用了lxml库对HTML解析获取数据. Xpath常用规则: nodename :选取此节点的所有子节点 // : ...

  4. Android组件--意图(Intent)

    1. 隐示调用和显示调用 参考资料:http://blog.csdn.net/harvic880925/article/details/38399723 1.概念 1). 显式意图: 能从intent ...

  5. 使用 pjax 实现无刷新切换页面

    一.目的 1.当打开链接的时候,页面是淡入显示,并且页面顶部会显示加载进度条,页面显示完成时,进度条加载满并且消失. 2.点击页面上的 a 标签时,显示加载进度条,并且当前页面淡出消失,当前页面淡出消 ...

  6. 怎样求逆序对数(Inverse Number)?

    #返回上一级 @Author: 张海拔 @Update: 2014-01-14 @Link: http://www.cnblogs.com/zhanghaiba/p/3520089.html /* * ...

  7. Groovy中的操作符重载

    操作者 方法 a + b a.plus(b)中 a - b a.minus(b)中 a * b a.multiply(b)中 a ** b a.power(b)中 a / b a.div(b)中 a ...

  8. 实习小结(三)--- 权限管理(RBAC)

    这一周,大多数时间 用来做需求分析,细化每个页面需要实现的功能.由于这个项目需要四种身份登录查看,分别是学生,老师,领导,管理员.每个身份登入系统显示得页面都不相同,四个角色分析完成后,统计了一下页面 ...

  9. Mysql分布式部署高可用集群方案

    HAproxy+Mycat +MySQL主从集群高可用方案 1.         HAproxy高可用方案: haproxy+keepalived,利用keepalived的VIP浮动能力,(多台ha ...

  10. Tarjan系列1

    tajan的dfs树系列算法: 求解割点,桥,强连通分量,点双联通分量,边双联通分量: tajan是一个dfs,把一个图变成一个dfs树结构, dfs树结构,本质是通过一个没有任何要求的dfs把图的边 ...