千家信息网

如何正常配置EF Core操作Oracle

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"如何正常配置EF Core操作Oracle",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何正常配置EF Core操作Oracle
千家信息网最后更新 2026年11月01日如何正常配置EF Core操作Oracle

这篇文章主要讲解了"如何正常配置EF Core操作Oracle",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何正常配置EF Core操作Oracle"吧!

配置

若要使用EF Core操作Oracle数据库,首先需要安装Oracle.EntityFrameworkCore。可以直接在NuGet上直接搜索安装即可。

按照惯例创建Context类继承DbContext和其他的数据库没有区别,但是我们在配置连接字符串的时候的同时需要为其指定Oracle数据库的版本,传入"11"代表11g,传入"12"代表12c。

public class MyContext : DbContext{    public MyContext(DbContextOptions options) : base(options)    { }    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)    {        optionsBuilder.UseOracle(            "DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密码;"            , b => b.UseOracleSQLCompatibility("12"));   //指定数据库版本    }}

如果我们在调试期间希望EF Core输出执行的Sql,我使用的方式自定义一个日志类,将Sql输出到Console中。

并在配置时将其注册进去。

 1 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 2 { 3     //配置数据库连接 4     optionsBuilder.UseOracle( 5         "DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密码;" 6         , b => b.UseOracleSQLCompatibility("12")); 7     //配置Sql输出控制台 8     var loggerFactory = new LoggerFactory(); 9     loggerFactory.AddProvider(new EFLoggerProvider());10     optionsBuilder.UseLoggerFactory(loggerFactory);11 12     base.OnConfiguring(optionsBuilder);13 }

由于是演示Demo,我们在开发ASP.NET Core项目时一般都是使用依赖注入来注册。如果使用依赖注入的写法,可以这样写。

services.AddDomainContext(builder =>{    //配置数据库连接    builder.UseOracle(        "DATA SOURCE=LOCALHOST:1521/ORACLE1;USER ID= 你的ID ;PASSWORD=你的密码;"        , b => b.UseOracleSQLCompatibility(version));    //配置Sql输出控制台    var loggerFactory = new LoggerFactory();    loggerFactory.AddProvider(new EFLoggerProvider());    builder.UseLoggerFactory(loggerFactory);});

查询数据

  在执行查询时,需要注意的有两点,一是Table映射的实体类的属性名称如果不显式指定的话需要使用全大写的形式,不然会报错"ORA-00904:标识符无效"。因为生成的Sql中是将所有的字段名都用双引号修饰的,而Oracle中存储字段名默认都是采用全大写的形式的。

所以如果我们不想将实体类所有的属性名称写成大写,就需要显式的指定映射的column的名称。可以使用DataAnnotations的特性标注所有属性,或者在Context中指定列映射。另外如果执行查询时需要指定Schema,也像下面这样配置。

方法1:

protected override void OnModelCreating(ModelBuilder modelBuilder){    //判断当前数据库是Oracle    if (this.Database.IsOracle())    {   //如果需要,手动添加Schema名称,如果是默认或者表前不需要Schema名就可以不用配置        modelBuilder.HasDefaultSchema("XUHY");    }    modelBuilder.Entity(entity =>    {        entity.ToTable("EMPLOYEE");        entity.Property(e => e.Id).IsRequired(); 12         //列映射        entity.Property(e => e.Id).HasColumnName("ID");        entity.Property(e => e.BirthDay).HasColumnName("BIRTHDAY");        entity.Property(e => e.Department).HasColumnName("DEPARTMENT");        entity.Property(e => e.EmployeeNo).HasColumnName("EMPLOYEENO");        entity.Property(e => e.IsValid).HasColumnName("ISVALID");        entity.Property(e => e.Name).HasColumnName("NAME");    });    base.OnModelCreating(modelBuilder);}

方法2:

[Table("EMPLOYEE ")]  //指定数据库对应表名public class Employee{    [Key]  //主键    [Column("ID")] //指定数据库对应表栏位名称    public long Id { get; set; }    [Column("EMPLOYEENO")]    public int EmployeeNo { get; set; }    [Column("NAME")]    public string Name { get; set; }    [Column("BIRTHDAY")]    public DateTime BirthDay { get; set; }    [Column("DEPARTMENT")]    public string Department { get; set; }    [Column("ISVALID")]    public bool IsValid { get; set; }}

经过上面的这些配置,便可以正常的执行数据的查询了。

await using var context = new MyContext(options);var employeeCollection = await context.Employee.AsNoTracking().ToListAsync();//var employeeCollection = await context.Employee.OrderBy(e => e.EmployeeNo).AsNoTracking().Skip(0).Take(5).ToListAsync();//分页foreach (var employee in employeeCollection){    Console.WriteLine($"{employee.Name} | {employee.EmployeeNo} | {employee.Department}");}Console.ReadLine();

插入数据

插入数据倒是和其他数据库差别不大,但是由于Oracle天生是没有自增Id的,如果我们设计的表的主键需要采用自增键就需要使用Sequence代替。在这种情况下就需要为实体类的主键指定Sequence的名称了。

 modelBuilder.Entity(entity => {     entity.ToTable("EMPLOYEE");     entity.Property(e => e.Id).IsRequired();     //!!!指定需要关联的序列名称!!!     entity.Property(e => e.Id).UseHiLo("SEQ_EMPLOYEE_ID");     //列映射 entity.Property(e => e.Id).HasColumnName("ID");     entity.Property(e => e.BirthDay).HasColumnName("BIRTHDAY");     entity.Property(e => e.Department).HasColumnName("DEPARTMENT");     entity.Property(e => e.EmployeeNo).HasColumnName("EMPLOYEENO");     entity.Property(e => e.IsValid).HasColumnName("ISVALID");     entity.Property(e => e.Name).HasColumnName("NAME"); });

随后便可以执行插入数据了。

var employee = new Employee(){    EmployeeNo = 6,    Name = "老周",    Department = "d6",    BirthDay = DateTime.Now.AddYears(-40),    IsValid = true};await using var context = new MyContext(options);var res = await context.Employee.AddAsync(employee);await context.SaveChangesAsync();Console.WriteLine("添加成功");Console.ReadLine();

以上就是简单总结的使用EF Core操作Oracle数据库时的一些比较特别的地方,当然本人仍在探索实践中,如有新发现也会抽空更新上来。

感谢各位的阅读,以上就是"如何正常配置EF Core操作Oracle"的内容了,经过本文的学习后,相信大家对如何正常配置EF Core操作Oracle这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

数据 配置 数据库 名称 查询 输出 大写 实体 密码 属性 学习 代表 内容 字段 就是 形式 情况 控制台 方法 版本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州百单互联网科技有限公司 互联网科技深圳 互联网未来科技 齐家互联网科技 南京欣网互联网科技 互联网金融科技平台 易通互联网络科技有限公司 互联网科技咨询 重庆科技学院互联网 中国科技互联网公司收入 互联网科技项目计划书材料类 重庆互联网医院沙龙医盟信息科技 知域互联网科技有限公司大骗子 每天都有哪些好的互联网科技 电子商务与互联网科技的关系 城市宝互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 普陀区互联网教育科技管理办法 广州智享互联网科技 颐高云石互联网科技 云电互联网科技 深圳期待互联网科技 互联网金融监管科技 赶超互联网科技 微信多开 上海科技产业互联网平台 上海互联网科技公司ppt 广州三三互联网科技有限公司 杭州科技互联网公司有哪些 平安好医生打造互联网科技医疗 互联网高科技绘画
0