前言

哇。。看看时间 真的很久很久没写博客了 将近一年了。

最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了。

本篇主要讲一下关于Entity Framework Core访问oracle数据库的采坑。。

强调一下,本篇文章发布之前 关于Entity Framework Core访问oracle数据库的甲骨文官方dll还未正式发布。

不过我已经在项目中用起来了。。介意的兄弟可以先等等。。甲骨文说的是本年第三季度。。

环境

1.官方文档中支持的环境

首先我们来看看所谓的官方支持吧。

操作系统:

1. Windows x64
  1.1Windows 8.1 (Pro and Enterprise Editions)
  1.2Windows 10 x64 (Pro, Enterprise, and Education Editions)
  1.3Windows Server 2012 R2 x64 (Standard, Datacenter, Essentials, and FoundationEditions)
  1.4Windows Server 2016 x64 (Standard and Datacenter Editions)
2.Linux x64
  2.1Oracle Linux 7
  2.2Red Hat Enterprise Linux 7

.NET版本:
  1.NET Core 2.1 或者更高
  2.NET Framework 4.6.1 或者更高

· Entity Framework Core版本:
  1.   2.1版本或者更高

依赖库:
  1. ODP.NET Core 18.3或者更高
  2.Microsoft.EntityFrameworkCore.Relational 2.1或者更高
  3.Access to Oracle Database 11g Release 2 (11.2) 或者更高

正文

本篇将采取CodeFirst的形式来创建数据库。。

1.创建数据库

我们创建上下文与实体如下:

    public class BloggingContext : DbContext    {public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            optionsBuilder.UseOracle(@"SQL Contion", b => b.UseOracleSQLCompatibility("11"));        }

protected override void OnModelCreating(ModelBuilder modelBuilder)        {

        }    }

public class Blog    {public int BlogId { get; set; }public string Url { get; set; }//public int Rating { get; set; }public List<Post> Posts { get; set; }    }

public class Post    {public int PostId { get; set; }public string Title { get; set; }public string Content { get; set; }

public int BlogId { get; set; }public Blog Blog { get; set; }    }

这里我们先介绍第一个要注意的地方,UseOracle参数里面跟的UseOracleSQLCompatibility方法,里面参数传递的11,指的是oracle11g版本。如果你是12g版本 请传递12.

因为11g和12g的SQL语法有较多不同的地方,所以用这个来区分。

然后我们add一个版本 执行nuget命令如下:(PS:不懂如何使用codeFirst的请移步:Entity Framework Core 之数据库迁移)

Add-Migration BanBen1

然后将版本更新到数据库如下:

Update-Database

数据库生成成功。

2.关于oracle序列的坑

我们这时候编写插入语句如下:

using (BloggingContext db = new BloggingContext())            {                db.Blogs.Add(new Blog { Url = "aaaaa1" });                db.SaveChanges();            }

看似没问题的语句,会得到一个错误消息如下:

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

这是因为我们没有给主键赋值导致的错误信息。(因为oracle没有自增主键,只能通过序列自增)

那么自增序列如何使用呢?

我们查看数据库会发现,如图:

codefirst已经帮我们生成了序列,但是并不会自动使用。我们需要配置一下:

在上下文中的OnModelCreating方法添加如下代码:

 protected override void OnModelCreating(ModelBuilder modelBuilder)        {            modelBuilder.Entity<Post>(entity =>            {                entity.ToTable("Posts");                entity.Property(o => o.PostId).ForOracleUseSequenceHiLo("Posts_PostId_sq3");

            });            modelBuilder.Entity<Blog>(entity =>            {                entity.ToTable("Blogs");                entity.Property(o => o.BlogId).ForOracleUseSequenceHiLo("Blogs_BlogId_sq1");

            });        }

指定对应表的序列。

然后在运行。即可添加成功了。

3.关于在Docker中部署的坑

在我的生产项目中。应该是打包到docker直接运行部署的。

不过在打包到docker的过程中又出现了诡异的问题。

就不重现了。。反正就是开发环境没有问题。。直接放到linux中也没问题。但是一旦打包到docker运行 就会查询不到数据。

经过多方查证 最终发现是微软提供的rumtime镜像,因为是精简版系统 所以里面的市区有问题。

在dockerfile中添加如下语句 在生成的时候 设置好时区:

FROM microsoft/dotnet:2.1-aspnetcore-runtimeENV TZ=Asia/Shanghai

这样就能成功的操作到数据库了。。

结束语

近期移植了好些个项目到.NET CORE 或多或少遇到了不少坑。。应该算是采坑无数了。。

其实大部分都集中在数据库连接这一块。。比如oracle  DB2 。。(PS:感觉也就mysql与sql server支持是最好的。。)

DB2虽然官方发布了。但是他的坑其实比oracle还大。。我们下篇在写。。

原文地址:https://www.cnblogs.com/GuZhenYin/p/10756548.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

使用Entity Framework Core访问数据库(Oracle篇)相关推荐

  1. 使用Entity Framework Core访问数据库(DB2篇)

    上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子~问题 ...

  2. oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  3. Entity Framework Core 之数据库迁移

    前言 最近打算用.NET Core写一份开源的简易CMS系统,来练练手 所以又去深入研究了一下Entity Framework Core 发现其实有些细节园子里还是很少讲到. 特意整理了几个细节. 正 ...

  4. 【华为云技术分享】Entity Framework Core 捕获数据库变动

    在实际项目中我们往往需要记录存储在数据库中数据的变动(例如修改数据前记录下数据的原始值),这样一来在发生误操作时可以将数据恢复到变动前的状态,也可以追溯到数据的修改人.大部分开发人员会自己定义记录数据 ...

  5. 使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇

    介绍 这是"使用 ASP.NET Core ,Entity Framework Core 和 ASP.NET Boilerplate 创建N层 Web 应用"系列文章的第二篇.以下 ...

  6. ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门

    ASP.NET Core 入门教程 8.ASP.NET Core + Entity Framework Core 数据访问入门 原文:ASP.NET Core 入门教程 8.ASP.NET Core ...

  7. Entity Framework Core的贴心:优雅处理带默认值的数据库字段

    对于用于保存记录添加时间的数据库日期字段,我们通常会设置一个 GETDATE() 的默认值,而不是在应用程序的代码中获取当前时间进行保存,这样可以避免由于web服务器时钟不同步引起的时间偏差. Ent ...

  8. 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)

    在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...

  9. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

最新文章

  1. R语言ggplot2可视化并添加特定区间的回归线、R原生plot函数可视化并添加特定区间的回归线:Add Regression Line Between Certain Limits
  2. 一步一图,带你走进 Netty 的世界!
  3. js判断浏览器是否支持webGL
  4. 【pytorch】pytorch自定义训练vgg16和测试数据集 微调resnet18全连接层
  5. python pip安装pyinstaller报错_pip install pyinstaller (安装过程报错解决)
  6. 文本对抗攻击入坑宝典
  7. Qt笔记-桌面应用程序加载字体库(ttf)
  8. 四年磨一剑:我是如何拿到蚂蚁 Offer 的?
  9. 小小的 Python 编程故事
  10. T-SQL查询处理详解
  11. java centos7 gcc编码 解决socket通信 汉字乱码
  12. python怎么提高_Python心得--如何提高代码质量
  13. 模板引擎-2-模板引擎提供的模板语法
  14. natapp 使用教程
  15. 使用layer 弹出对话框 子父页面相互参数传递 父页面获取子页面参数实例
  16. vscode免密登录需要更改authorized_keys的权限
  17. Windows 10 创意者更新-1703所有版本汇总
  18. 分门别类刷leetcode——递归和回溯搜索(C++实现)
  19. dsoframer-在线编辑office文档,一款开源的由微软提供
  20. 机器学习最好的科普文章

热门文章

  1. javascript权威指南--学习笔记
  2. 学习韩立刚老师IT运维课程,成为韩立刚老师正式学生,在全国范围为你就近推荐工作。...
  3. 优秀的培训机构该如何培养学生?
  4. insert /*+ APPEND */
  5. .NET6之MiniAPI(二十九):UnitTest
  6. GeneralUpdate实现应用程序更新
  7. 记一次 .NET 某资讯论坛 CPU爆高分析
  8. 日常使用Git,这些问题你遇到过吗?
  9. 基于ABP落地领域驱动设计-06.正确区分领域逻辑和应用逻辑
  10. 都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...