Oracle与EntityFramework(EF)的一些事情
概要
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)的一些事情的更多相关文章
- 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 ...
- [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作
基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作 转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...
- 基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作
目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成方便的也就当属EntityFramework(以下简称EF,不知道为什么,总EF这个缩写好不专业).但是,好多公司使用的又是ORA ...
- 基于Oracle的EntityFramework的WEBAPI2的实现(二)——使用DbFirst
之所以使用DbFirst而没有使用CodeFirst是因为考虑到现实的情况中,我们之所以会选择oracle而不是SQL SERVER,一方面是因为之前公司已经在使用Oracle,而且有好多我们需要用到 ...
- MVC之实体框架(数据持久化框架)EntityFrameWork(EF)
EF - EntityFrameWork 中文名:实体框架(数据持久化框架) 1.使用EF查询(Linq to EF) 1.1使用标准查询运算符来查询 OumindBlogEntities db = ...
- Oracle数据库用EF操作的示例
Using EF Oracle Sample Provider with EDM Designer (from msdn) Many people are asking if it is possi ...
- EntityFramework ,ef 介绍
EntityFramework之领域驱动设计实践 分层架构 在引入实例以前,我们有必要回顾,并进一步了解分层架构.“层”是一种体系结构模式[POSA1],也是被广大软件从业人员用得最为广泛而且最为灵活 ...
- EntityFramework(EF)贪婪加载和延迟加载的选择和使用
贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in co ...
- Oracle数据库PL/SQL那点事情---修改过电脑的用户名
在安装Oracle数据库的PL/SQL工具时候,电脑名称是重装系统后自动生成的用户名名称,作为程序员,有很强的强迫症,就想利用自己的英文名称作为自己电脑的名称,所以就修改了电脑的名称:结果PL/SQL ...
随机推荐
- STL 排序(转载)
这篇文章关于STL中的排序写的虽不深入,但是还是挺好的. 1.sort sort有两种形式,第一种形式有两个迭代器参数,构成一个前开后闭的区间,按照元素的 less 关系排序:第二种形式多加一个指定排 ...
- 亿级别记录的mongodb分页查询java代码实现
1.准备环境 1.1 mongodb下载 1.2 mongodb启动 C:\mongodb\bin\mongod --dbpath D:\mongodb\data 1.3 可视化mongo工具Robo ...
- LOJ #6022. 重组病毒
Description 支持以下操作 1.access一个点 2.问一个点上面的重链的个数 3.换根 , 并access原来的根 Solution 对于重链个数 , 我们在 \(access\) 的时 ...
- 基于开源Red5搭建的视频直播平台
开始之前,为了便于大家了解Red5,此处引用网络文字,非原创 引言 流媒体文件是目前非常流行的网络媒体格式之一,这种文件允许用户一边下载一边播放,从而大大减少了用户等待播放的时间.另外通过网络播放流媒 ...
- [转]OData and Authentication – Part 6 – Custom Basic Authentication
本文转自:https://blogs.msdn.microsoft.com/astoriateam/2010/07/21/odata-and-authentication-part-6-custom- ...
- 今天瞎写的关于XML的一些。
using System;using System.Windows.Forms;using System.Xml; namespace winformDemo{ public partial c ...
- 京东-Java开发工程师-一面
时间:2017-4-7 16:47 时长:32分19秒 类型:笔试前电话面试 之前打过一个电话过来说了一声,下午就直接打过来面试了,没有自我介绍貌似 1. 你做的这些东西是什么样的? 2. 选一个你觉 ...
- 7、包装类、System、Math、Arrays、大数据运算
基本类型封装 基本数据类型对象包装类概述 *A:基本数据类型对象包装类概述 *a.基本类型包装类的产生 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字 ...
- JSP简单实现统计网页访问次数
JSP简单实现统计网页访问次数 需求:统计网页的访问次数 核心思想:利用application对象,将访问次数的信息放入application对象中,每次访问就+1.这里利用了application对 ...
- java设计模式-观察者模式,装饰者模式
1.1定义 慨念:定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 即:主题和观察者定义了一对多的关系,观察者依赖于主题,只要主题发生变化,观察者就 ...