oracle精簡版_使用Entity Framework Core訪問數據庫(Oracle篇)

前言

哇。。看看時間 真的很久很久沒寫博客了 將近一年了。

最近一直在忙各種家中事務和公司的新框架 ?終于抽出時間來更新一波了。

本篇主要講一下關于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 Blogs { get; set; }public DbSet 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 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沒有自增主鍵,只能通過序列自增)

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

我們查看數據庫會發現,如圖:3112cc9fcf0ed29cffdc97244afd21f6.png

codefirst已經幫我們生成了序列,但是并不會自動使用。我們需要配置一下:

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

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity =>
{
entity.ToTable("Posts");
entity.Property(o => o.PostId).ForOracleUseSequenceHiLo("Posts_PostId_sq3");
});
modelBuilder.Entity(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?902e81b1862167d4ae03d009c4b47b19.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258650.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

interrupt、interrupted 、isInterrupted 區別

interrupt:調用方法,是線程處于中斷狀態,但是這個方法只是讓線程設置為中斷狀態,并不會真正的停止線程。支持線程中斷的方法就是在堅持線程中斷狀態,一旦線程中斷狀態被設置為中斷,就會拋出異常。interrupt…

java String部分源碼解析

String類型的成員變量 /** String的屬性值 */ private final char value[];/** The offset is the first index of the storage that is used. *//**數組被使用的開始位置**/private final int offset;/** The count is the number of characters in the String. *//**String中…

python在材料模擬中的應用_基于Python的ABAQUS二次開發及在板料快速沖壓成形模擬中的應用...

2009doi:1013969/j1issn1100722012120091041013基于Python的ABAQUS二次開發及在板料快速沖壓成形模擬中的應用(北京航空航天大學飛行器制造工程系,北京100191)吳向東劉志剛萬敏王文平黃霖摘要:采用Python腳本語言對ABAQUS的前處理模塊進行二次開發,討論了Python腳本在ABAQUS二次…

Doxygen簡介

(轉自:http://www.cnblogs.com/liuliunumberone/archive/2012/04/10/2441391.html) 一.什么是Doxygen? Doxygen 是一個程序的文件產生工具,可將程序中的特定批注轉換成為說明文件。通常我們在寫程序時,或多…

javascript之閉包理解以及應用場景

1 function fn(){2 var a 0;3 return function (){4 return a;5 } 6 }如上所示,上面第一個return返回的就是一個閉包,那么本質上說閉包就是一個函數。那么返回這個函數有什么用呢?那是因為這個函數可以調用到它外部的a…

faster rcnn學習之rpn、fast rcnn數據準備說明

在上文《 faster-rcnn系列學習之準備數據》,我們已經介紹了imdb與roidb的一些情況,下面我們準備再繼續說一下rpn階段和fast rcnn階段的數據準備整個處理流程。 由于這兩個階段的數據準備有些重合,所以放在一起說明。 我們并行地從train_rpn與train_fas…

sql server規范

常見的字段類型選擇 1.字符類型建議采用varchar/nvarchar數據類型2.金額貨幣建議采用money數據類型3.科學計數建議采用numeric數據類型4.自增長標識建議采用bigint數據類型 (數據量一大,用int類型就裝不下,那以后改造就麻煩了)5.時間類型建議采用為dat…

關于標準庫中的ptr_fun/binary_function/bind1st/bind2nd

http://www.cnblogs.com/shootingstars/archive/2008/11/14/860042.html 以前使用bind1st以及bind2nd很少,后來發現這兩個函數還挺好玩的,于是關心上了。在C Primer對于bind函數的描述如下:“綁定器binder通過把二元函數對象的一個實參綁定到…

CSS偽類

一、首字母的顏色字體寫法 p:first-letter 二、文本的特殊樣式設置 first-line css偽類可與css類配合使用 偽元素只能用于塊級元素 轉載于:https://www.cnblogs.com/boyblog/p/4623374.html

php 結構體_【開發規范】PHP編碼開發規范下篇:PSR-2編碼風格規范

之前的一篇文章是對PSR-1的基本介紹接下來是PSR-2 編碼風格規范,它是 PSR-1 基本代碼規范的繼承與擴展。PSR-1 和PSR-2是PHP開發中基本的編碼規范,大家其實都可以參考學習下,雖然說每個開發者都有自己熟悉的一套開發規范,但是我覺…

faster rcnn學習之rpn訓練全過程

上篇我們講解了rpn與fast rcnn的數據準備階段,接下來我們講解rpn的整個訓練過程。最后 講解rpn訓練完畢后rpn的生成。 我們順著stage1_rpn_train.pt的內容講解。 name: "VGG_CNN_M_1024" layer {name: input-datatype: Pythontop: datatop: im_infotop: …

BitMapData知識 轉

Bitmap和BitmapData 2010.5.25 smartblack整理 一、flash.display.Bitmap類及其兩個子類 1、繼承自DisplayObject,和InteractiveObject平級,所以無法調度鼠標事件,可以使用額外的包裝容器(Sprite)來實現偵聽。 2、只支持GIF、JPEG、PNG格式&a…

Android學習之高德地圖的通用功能開發步驟(二)

周一又來了,我就接著上次的開發步驟(一)來吧,繼續把高德地圖的相關簡單功能分享一下 上次寫到了第六步,接著寫第七步吧。 第七步:定位 地圖選點 路徑規劃 實時導航 以下是我的這個功能NaviMapActivity的…

Oracle中分區表中表空間屬性

Oracle中的分區表是Oracle中的一個很好的特性,可以把大表劃分成多個小表,從而提高對于該大表的SQL執行效率,而各個分區對應用又是透明的。分區表中的每個分區有獨立的存儲特性,包括表空間、PCT_FREE等。那分區表中的各分區表空間之…

期刊論文格式模板 電子版_期刊論文的框架結構

最近看到很火的一句話,若不是生活所迫,誰愿意把自己弄得一身才華。是否像極了正想埋頭苦寫卻毫無頭緒的你?發表期刊論文的用途 :1: 學校或者單位評獎,評優,推免等2:申領學位證(如畢業硬性要求&a…

faster rcnn學習之rpn 的生成

接著上一節《 faster rcnn學習之rpn訓練全過程》,假定我們已經訓好了rpn網絡,下面我們看看如何利用訓練好的rpn網絡生成proposal. 其網絡為rpn_test.pt # Enter your network definition here. # Use ShiftEnter to update the visualization. name: &q…

初學java之常用組件

1 2 import javax.swing.*;3 4 import java.awt.*;5 class Win extends JFrame6 {7 JTextField mytext; // 設置一個文本區8 JButton mybutton;9 JCheckBox mycheckBox[]; 10 JRadioButton myradio[]; 11 ButtonGroup group; //為一…

anaconda 安裝在c盤_最省心的Python版本和第三方庫管理——初探Anaconda

打算把公眾號和知乎專欄的文章搬運一點過來。 歷史文章可以去關注我的公眾號:不二小段,或者知乎:段小草。也歡迎來看我的視頻學Python↓↓↓跟不二學Python這篇文章可以作為Python入門的第一站可以結合這期視頻來看,基本上是這期視…

Iris recognition papers in the top journals in 2017

轉載自:https://kiennguyenstuff.wordpress.com/2017/10/05/iris-recognition-papers-in-the-top-journals-in-2017/ Top journals: – IEEE Transaction on Pattern Analysis and Machine Intelligence (PAMI) – Pattern Recognition (PR) – IEEE Transaction on…

判斷瀏覽器是否為IE內核的最簡單的方法

沒啥說的,直接貼代碼,算是ie hack了。 if (![1,]) {alert(is ie); } 轉載于:https://www.cnblogs.com/jasondan/p/3716660.html