項目多是用的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"]