歡迎光臨
每天分享高質量文章

使用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沒有自增主鍵,只能透過序列自增)

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

我們檢視資料庫會發現,如圖:

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-runtime
ENV TZ=Asia/Shanghai

這樣就能成功的操作到資料庫了。。

結束語

近期移植了好些個專案到.NET CORE 或多或少遇到了不少坑。。應該算是採坑無數了。。

其實大部分都集中在資料庫連線這一塊。。比如oracle  DB2 。。(PS:感覺也就mysql與sql server支援是最好的。。)

DB2雖然官方釋出了。但是他的坑其實比oracle還大。。我們下篇在寫。。

已同步到看一看
贊(1)

分享創造快樂