关于Oracle数据库 EF 报 ORA-01918: 用户 'dbo' 不存在 错误解决

在使用C# EF 连接Oracle 数据库时,有时会报“ORA-01918: 用户 'dbo' 不存在 错误解决”,网上查了很多,大多都解释不清楚,这里亲自试了一下,并总结如下:

原因:

之所以会报这种错误,是因为oracle 默认方位用户指定为 dbo,在Sql Server 中这个dbo 是我们熟悉的系统默认对象,但在oracle 中一般不会有这个schema,即用户,所以会报错

解决方法

1.创建dbo用户

  create user dbo identifeid by 123;  //创建用户  dbo 密码 123
  grant connect,resource to dbo;      //授权
  alter user dbo account unlock;      //解锁

2.修改默认用户

  protected ovveride void OnModelCreating(DbModelBuilder modelBuilder){
    modelBuilder.HasDefaultSchem("T1");  //注意,这里一定要大写,因为C#是区分大小写的,oracle 中默认是大写,虽然oracle 不区分大小写,但是c#会因为大小写问题找不到用户
    base.OnModelCreating(modelBuilder);
  
  }

示例:

//数据上下文
using Oracle.ManagedDataAccess.EntityFramework;
using System.Data.Entity;
using ConsoleEF.Model;
namespace ConsoleEF.Infrastructure
{
   public class PatientDbContext:DbContext
   {
       public PatientDbContext() : base("name=connStr") { }
       public DbSet<Patient> Patients { get; set; }
       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
           modelBuilder.HasDefaultSchema("T1");
           base.OnModelCreating(modelBuilder);
       }
   }
}
//模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleEF.Model
{
   [Table("PATIENTS")]     //这里使用大写标注表名,是因为Oracle 默认生成表名为大写,如果不指定,则会生成带有双引号"Patients"  的表名,字段名也是一样.
   public class Patient
   {
       [Key]
       [Column("ID")]
       public int ID { get; set; }
       [Column("NAME")]
       [StringLength(30)]
       public string NAME { get; set; }
       [Column("ZHEND")]
       [StringLength(50)]
       public string ZHEND { get; set; }
      
   }
}

//测试
using ConsoleEF.Infrastructure;
using System;
using System.Linq;
namespace ConsoleEF
{
   class Program
   {
       private static PatientDbContext pdb;
       static void Main(string[] args)
       {
           try
           {
               pdb = new PatientDbContext();
               Console.WriteLine(pdb.Patients.Count());
           }
           catch (Exception ex)
           {
               Console.WriteLine(ex.Message);
           }

           Console.ReadKey();
       }
      
   }
}
//配置文件 省略部分
 <connectionStrings>
   <add name="connStr" providerName="Oracle.ManagedDataAccess.Client" connectionString="User         Id=t1;Password=tt123;Data Source=localhost:1521/orcl" />
 </connectionStrings>

posted @   丹心石  阅读(595)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示