避免使用Entity Framework的Oracle模式名称

时间:2017-09-06 07:08:40

标签: c# database oracle entity-framework entity-framework-6

我正在使用Official Oracle SQL和Entity Framework驱动程序来读取数据库。但是在读取数据库时,它会在表名前加上“dbo”。:

SELECT
*
FROM "dbo"."Woningen"

没有“dbo”。前缀代码工作正常,有,它会导致错误“表或视图不存在”。这可能是因为用户不是'dbo',因此它无权访问该架构。这是我正在使用的实体框架代码:

[Table("Woningen")]
public class Woningen

我已经尝试更新Oracle nuget包但是它出现错误“连接字符串格式不正确”。所以它可能与以前有相同的错误,它只是更快失败。这是我使用的connectionString格式:

<add name="DefaultConnection"
  providerName="Oracle.ManagedDataAccess.Client" 
  connectionString="USER ID=testUser;PASSWORD=password;  
  Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=serverUrl)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=Database)));"/>

我可以看到这个问题的三种可能的解决方案,但不知道如何实现它们:

  1. 操纵实体框架以从查询中排除模式名称
  2. 授予我的用户访问架构的权限
  3. 更新驱动程序并修复连接字符串格式,如果有人知道格式如何更改..
  4. 请注意,当前代码已在生产中使用,因此当前版本应该没问题。数据库及其用户是新的,因此问题可能在于如何创建它们。

1 个答案:

答案 0 :(得分:3)

您可以指定Entity Framework使用的架构。见下文

如果您使用的是Entity Framework 6+,则可以使用以下

public class Context : DbContext
{  
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //Set a default schema for ALL tables
        modelBuilder.HasDefaultSchema("YourSchemaName");
    }
}

如果您希望在特定表格上设置架构......

[Table("Woningen"), Schema = "YourSchemaName")]
public class Woningen { }

如果您使用的是EF5

public class Context : DbContext
{    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    { 
         // Unfortunately you have to specify each table you want to set a schema for...
         modelBuilder.Entity<Woningen>().ToTable("Woningen", "YourSchemaName");
    } 
}