使用实体框架避免Oracle架构名称

问题描述:

我正在使用Official Oracle SQL和Entity Framework驱动程序来读取数据库。但是,读取数据库时,它的前缀表名与“DBO”:使用实体框架避免Oracle架构名称

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. 更新驱动程序和修复ConnectionString的格式,如果有人知道的格式是如何改变..

请注意,当前代码已在生产中工作,所以当前版本应该没问题。数据库和它的用户是新的,所以问题可能在于它们是如何创建的。

+0

您可以指定在EF中使用适当的模式,如果有帮助? EF6 +'modelBuilder.HasDefaultSchema(“您的模式名称”);' –

+0

@DanielShillcock谢谢,这是解决方案,使用用户名作为模式名称。如果你把它做成一个答案,我会接受它。 – MrFox

您可以指定实体框架使用的模式。见下面

如果您正在使用实体框架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"); 
    } 
} 
+0

有关数据库优先方法的任何建议?因为在几乎所有情况下,dev env的模式都不同于prod env。 –

+0

@SyedAliTaqi也许在webconfig /应用程序设置中存储模式名称? –

+0

感谢您的快速回复!我尝试过,但无法很好地连接所有部件。如果您可以共享博客或链接代码,作为指南,会非常有帮助吗? –