使用EntityFramework 6连接远程Oracle数据库时触发ORA-01918错误
这个问题我之前帮不少开发者解决过,本质是Entity Framework默认沿用了SQL Server的dbo schema习惯,但Oracle体系里并没有这个默认用户/schema,加上你的schema是小写的,得针对性调整配置才行,下面给你几个可行的解决方案:
1. 在DbContext中显式指定默认Schema
EF6默认会尝试用dbo作为数据库对象的schema,你需要在自定义的DbContext中重写OnModelCreating方法,把默认schema设置为你实际的小写schema名称:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 替换成你核实过的小写schema名称 modelBuilder.HasDefaultSchema("yourschema"); base.OnModelCreating(modelBuilder); }
如果只是个别实体需要指定schema,也可以单独配置:
modelBuilder.Entity<YourEntity>().ToTable("your_table_name", "yourschema");
2. 确认Oracle Schema的大小写有效性
Oracle默认会把用户名/schema名称转成大写,如果你确实是小写的schema,必须确保创建这个用户时是用双引号括起来的(比如CREATE USER "yourschema" IDENTIFIED BY yourpassword;),否则Oracle会自动将其转为大写,这时候你用小写名称访问自然找不到对应的schema。
同时要保证连接字符串里的用户名也是小写的,并且和你的schema名称完全一致。
3. 检查EF配置文件的Provider设置
确保你的web.config或app.config里正确配置了Oracle的EF provider,避免EF误用其他数据库的provider:
<entityFramework> <providers> <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework" /> </providers> </entityFramework>
另外,连接字符串的providerName要指定为Oracle.ManagedDataAccess.Client,而不是默认的SQL Server provider。
4. 验证连接用户的权限
确保你用来连接的用户就是schema本身的拥有者,或者拥有访问该schema下所有数据库对象的权限——如果是schema本身的用户,默认就具备所有权限,不会出现权限导致的访问问题。
内容的提问来源于stack exchange,提问作者Alexander Kozachenko

