zoukankan      html  css  js  c++  java
  • .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"]
  • 相关阅读:
    Vue 中常见性能优化
    简单模板引擎实现
    函数柯理化
    url 解析
    快排
    防抖节流实现
    call、apply、bind 实现
    深克隆
    数组去重
    eventEmitter 简单实现
  • 原文地址:https://www.cnblogs.com/cangfriend/p/13093914.html
Copyright © 2011-2022 走看看