.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"]
原文地址:https://www.cnblogs.com/cangfriend/p/13093914.html