前言

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

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

本篇主要讲一下关于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(""));
} 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-runtime
ENV TZ=Asia/Shanghai

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

结束语

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

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

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

使用Entity Framework Core访问数据库(Oracle篇)的更多相关文章

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

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

  2. Entity Framework Core 之数据库迁移

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

  3. ASP.NET CORE系列【六】Entity Framework Core 之数据库迁移

    前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framework Core 发现园子里有些文章讲得不是那么细节,对于新手小白来说,可能会有点懵. 特意整理 ...

  4. .NET Core Entity使用Entity Framework Core链接数据库

    首先安装Nuget包 Install-package Microsoft.EntityFrameworkCore Install-package Microsoft.EntityFrameworkCo ...

  5. 添加Entity Framework Core,数据库迁移

    1.建立Entity 建立IEntity的接口 建立实现IEntity接口的抽象类Entity 建立类继承抽象类Entity 2. 数据库放到infrastructure的项目中 3.注册和配置这个d ...

  6. asp.net core + entity framework core 多数据库类型支持实战

    根据微软官方文档的说法,有两种方法可以实现在一个app中同时适应多种不同类型的数据库,并且全部支持migrations操作.其一,使用两个dbcontext:其二,修改migration文件,添加特定 ...

  7. [UWP小白日记-11]在UWP中使用Entity Framework Core(Entity Framework 7)操作SQLite数据库(一)

    前言 本文中,您将创建一个通用应用程序(UWP),使用Entity Framework Core(Entity Framework 7)框架在SQLite数据库上执行基本的数据访问. 准备: Enti ...

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

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

  9. ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

随机推荐

  1. Drupal7.8的安装注意的问题

    首先推荐在安装之前,首先阅读一下官方的Installation guide ,说实话话,这玩意安装没有Joomla安装那么平滑,大多数问题,guide都会提到.我是先安装后看的这个guide,比较折腾 ...

  2. self-sizing cell的一个问题

    如何TableViewCell里面再加上CollectionView这类的ScrollView玩意,那自动算高就失效了,还是得用 override func tableView(_ tableView ...

  3. 获取radio、select、checkbox标签选中的值

    <input type="radio" id="radio1" name="radio"><label for=" ...

  4. java之Spring(IOC)注解装配Bean详解

    在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看Annotation的魅力所在吧. 先来看看之前的bean ...

  5. 基于Python的数据分析:数据库索引效率探究

    索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率.同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更长.有得有失.我希望做一些研究测试,搞清楚索引对于我们使用数 ...

  6. AVL Tree 操作

    1.AVL树是带有平衡条件的二叉查找树, 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 2.AVL树的删除要比插入复杂.如果删除相对较少,那么用懒惰删除的方法是最好的策略. 3 ...

  7. 谈谈书本《c#物联网程序设计基础》中的技术瑕疵,如果你将要读本书,请进来看看!

    今天去书店看到一本名为<c#物联网程序设计基础>的书,对物联网感兴趣的我抓起来就看,书中的项目都是上位机开发项目,较简单,如果物联网开发只是这样,看起来我做物联网开发也是绰绰有余.这边书我 ...

  8. 实现对ASP.NETMvc及Asp.NetCore的权限控制

    AccessControlHelper Build Status Intro 由于项目需要,需要在 基于 Asp.net mvc 的 Web 项目框架中做权限的控制,于是才有了这个权限控制组件. 项目 ...

  9. 【转】高效利用Fundebug追踪Node.js日志发现问题

    不管使用哪个语言做项目开发,我们都会自觉地用日志来做相关记录.比如,HTTP请求,报错信息.某些关键节点埋点记录等等.在Java中有大名鼎鼎的Log4J,于是在Node.js中也有了log4js. 日 ...

  10. 二十五、Hadoop学记笔记————Hive复习与深入

    Hive主要为了简化MapReduce流程,使非编程人员也能进行数据的梳理,即直接使用sql语句代替MapReduce程序 Hive建表的时候元数据(表明,字段信息等)存于关系型数据库中,数据存于HD ...