.Net Core 用 EntityFramework 讀取 Oracle


項目多是用的Oracle數據庫; Docker 下 .NetCore 編寫 Rabbitmq 測試成功,准備測試用 EntityFramewCore 讀取 Oracle;

1. 有坑的地方,注意 引用類庫的版本(截止2020/06);

<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="2.19.60" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
<PackageReference Include="Oracle.EntityFrameworkCore" Version="2.19.60" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.2.6" />

 

Oracle EF 配套.Net Core的版本,目前直到 2.19.60;對應這個版本,其他所有都要在這個大版本之內(小版本不算);

Oracle.EntityFrameworkCore

此插件主要是為了連接Oracle數據庫;
依賴項:        
Microsoft.EntityFrameworkCore.Relational (>= 2.1.11 && < 3.0.0) 是小於;
Oracle.ManagedDataAccess.Core (>= 2.19.60 && < 2.20.0);

2. 配套EntityFramwork的 領域類

using System;
using Oracle.EntityFrameworkCore;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations.Schema; //領域類
using System.Linq;

System.ComponentModel.DataAnnotations.Schema 包含的特性:

Attribute 描述
Table 指定被映射的類在數據庫生成的表名
Column 指定被映射的屬性在表中的列名和數據類型
Index 在指定列上創建索引(僅EF6.1以上版本支持)
ForeignKey 給導航屬性指定外鍵屬性
NotMapped 標記的屬性不會被映射到數據庫
DatabaseGenerated 指定的屬性將會映射成數據庫表中的計算列,所以這個屬性應是只讀的。也可以用在把屬性映射成標識列(自增長列)
InverseProperty 當兩個類之間包含多重關系的時候,默認約定會排列組合他們的導航屬性組合並一一創建外鍵,InverseProperty可以標記實際的主外鍵關系,從而過濾掉因排列組合出來的無用外鍵
ComplexType 標記一個類為復雜類型

 3. Oracle table 映射 類的代碼示例

    [Table("AA")] //Oracle 中的 Table 就是 “AA”
    public class tabledemo
    {
        //line_name,up_banci,loss,col_type
        [Column("LINE_NAME")]
        public string linename { get; set; }

        [Column("UP_BANCI")]
        public string upbanci { get; set; }

        [Column("LOSS")]
        public int loss { get; set; }

        [Column("COL_TYPE")]
        public string coltype { get; set; }

    }

4.  DbContex類,實現調用oracle

 
    public class SFCContext : DbContext
    {
        public DbSet<tabledemo> Tabledemos { get; set; } //引用了上邊定義好的 table 映射類

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<tabledemo>().HasKey(c => c.linename);    //EF Table必須有主鍵,跟Oracle不同,這里強制指定Oracle Table的主鍵;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseOracle("USER ID=你的用戶名;PASSWORD=你的密碼;DATA SOURCE=你的IP地址:1521/數據庫並;", b => b.UseOracleSQLCompatibility("12"));//這半句就厲害了,oracle官網指導的,指定Oracle的版本;詳細可以參考Oracle官網;
        }
    }
 

 

5. 調用就簡單多了

            using (var db = new SFCContext())
            {
                var _tmDem = from c in db.Tabledemos //where c.linename == "LINE#20" orderby c.linename descending select c; Console.WriteLine(_tmDem.Count()); foreach(var _tml in _tmDem) { Console.WriteLine(_tml.linename); } }
 
         

6. 最后 Docker File,使用.Net Core 控制台程序,運行在Docker中,測試OK;

FROM mcr.microsoft.com/dotnet/core/runtime:3.1 AS base
WORKDIR /app FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY ["OracleEFCoreDemo.csproj", "./"] RUN dotnet restore "./OracleEFCoreDemo.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "OracleEFCoreDemo.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "OracleEFCoreDemo.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "OracleEFCoreDemo.dll"]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM