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