2017-09-06 130 views
1

我正在使用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

回答

1

您可以指定實體框架使用的模式。見下面

如果您正在使用實體框架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

感謝您的快速回復!我嘗試過,但無法很好地連接所有部件。如果您可以共享博客或鏈接代碼,作爲指南,會非常有幫助嗎? –