哇。。看看時間 真的好久好久沒寫博客了 將近一年了。html
最近一直在忙各類家中事務和公司的新框架 終於抽出時間來更新一波了。mysql
本篇主要講一下關於Entity Framework Core訪問oracle數據庫的採坑。。linux
強調一下,本篇文章發佈以前 關於Entity Framework Core訪問oracle數據庫的甲骨文官方dll還未正式發佈。sql
不過我已經在項目中用起來了。。介意的兄弟能夠先等等。。甲骨文說的是本年第三季度。。docker
首先咱們來看看所謂的官方支持吧。數據庫
操做系統:oracle
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 或者更高less
· Entity Framework Core版本:
1. 2.1版本或者更高ide
依賴庫:
1. ODP.NET Core 18.3或者更高
2.Microsoft.EntityFrameworkCore.Relational 2.1或者更高
3.Access to Oracle Database 11g Release 2 (11.2) 或者更高
本篇將採起CodeFirst的形式來建立數據庫。。
咱們建立上下文與實體以下:
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
數據庫生成成功。
咱們這時候編寫插入語句以下:
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"); }); }
指定對應表的序列。
而後在運行。便可添加成功了。
在個人生產項目中。應該是打包到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還大。。咱們下篇在寫。。