Избегайте имени схемы Oracle с Entity Framework

2

Я использую официальный драйвер Oracle SQL и Entity Framework для чтения базы данных. Но при чтении базы данных он префикс имени таблицы с "dbo".:

SELECT
*
FROM "dbo"."Woningen"

Без "дбо". префикс кода работает нормально, поскольку он вызывает ошибку "таблица или представление не существует". Вероятно, это связано с тем, что пользователь не является "dbo", поэтому он не имеет доступа к этой схеме. Это код Entity Framework, который я использую:

[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. Манипулировать Entity Framework для исключения имен схем из запросов
  2. Предоставьте пользователю доступ к схеме
  3. Обновите драйвер и исправьте формат строки подключения, если кто-то знает, как изменился формат.

Обратите внимание, что текущий код уже работает в производстве, поэтому текущая версия должна быть в порядке. База данных и ее пользователь являются новыми, поэтому проблема может заключаться в том, как они создаются.

  • 0
    Вы можете указать подходящую схему для использования в EF, если это поможет? EF6 + modelBuilder.HasDefaultSchema(“your schema name”);
  • 0
    @DanielShillcock Спасибо, это решение, использующее имя пользователя в качестве имени схемы. Если вы сделаете это ответом, я приму это.
Теги:
database
entity-framework
entity-framework-6

1 ответ

1
Лучший ответ

Вы можете указать схему, используемую 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");
    } 
}
  • 1
    Любая рекомендация для базы данных первым подходом? поскольку почти в каждом случае схема dev env отличается от prod env.
  • 0
    @SyedAliTaqi Возможно, сохраните имя схемы в настройках webconfig / application?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню