Просто другое сообщение об ошибке ORA-00942: таблица или представление не существует, однако я не могу найти какое-либо решение, которое работает для меня

#oracle #entity-framework #visual-studio-2017 #ado.net

#Oracle #сущность-фреймворк #visual-studio-2017 #ado.net

Вопрос:

Я использую Visual Studio 2017. Oracle — это версия 11, но я не уверен насчет субверсии Oracle.

Я создал две новые таблицы в Oracle. Я разрешил им Выбирать, обновлять, вставлять и удалять с помощью этой команды:

 GRANT DELETE, INSERT, UPDATE, SELECT on "ADMIN"."MYTABLE" to "APP";
 

Все существующие таблицы используют, по крайней мере, одинаковые привилегии, и я могу запрашивать их через entity Framework, пока корова не вернется домой без каких-либо проблем. Это просто мои новые таблицы.

Мой контекстный файл выглядит следующим образом:

 public class OracleContext : DbContext
{
    public OracleContext() : base("name=OracleConnection") {}

    public DbSet<MyTable> myTable { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("ADMIN");
        modelBuilder.Entity<MyTable>().ToTable("MYTABLE");
        base.OnModelCreating(modelBuilder);
    }
}
 

Мой класс таблицы выглядит так:

 [Table("ADMIN.MYTABLE")]
public class MyTable
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("ID", TypeName = "NUMBER")]
    public int ID { get; set; }

    [Column("Name", TypeName = "VARCHAR2")]
    public string Name { get; set; }
}
 

У меня есть файл карты, который выглядит следующим образом:

 public class MyTableMap : IMapper
{
    public void Map(DbModelBuilder builder)
    {
        var en = builder.Entity<MyTable>();

        en.ToTable("ADMIN.MYTABLE");

        en.Property(t => t.ID)
                .HasColumnName("ID")
                .IsRequired();

        en.Property(t => t.NAME)
                .HasColumnName("NAME");
    }
}
 

Мой код entity framework выглядит следующим образом:

 using (var context = new OracleContext())
{
    List<MyTable> myTable = context.MyTable.ToList();
}
 

Я новичок в Oracle. Я работаю с SQL Server, но я привлек к этому других разработчиков, которые являются экспертами Oracle, и они также были сбиты с толку.

Просто чтобы посмотреть, что произойдет, я использовал ADO.Net, чтобы открыть соединение и передать строку запроса SQL объекту command и вернуть reader, и я получаю ту же ошибку с моими новыми таблицами, однако я могу выполнить запрос select * для любой из других таблиц в базе данных без каких-либо проблем.

Я могу запустить этот запрос в Oracle SQL Developer без каких-либо проблем.

У кого-нибудь есть какие-либо идеи о том, что я могу делать неправильно.


ОБНОВЛЕНИЕ (15.12.2020): проблема, с которой я сталкиваюсь, связана с созданием «ASP.Net Веб-приложение (.NET Framework)» приложение. Я начал с приложения, которое я разрабатывал, но затем я создал тестовое приложение в качестве «ASP.Net Веб-приложение (.NET Framework)» приложение и я получаем одинаковые результаты.

Однако «Консольное приложение (.New Framework)» будет работать. Ранее, когда я заставил его работать в консольном приложении, я просто предположил, что он будет работать в любом типе веб-приложения, но я ошибался.

Я подключаюсь к Oracle с помощью Oracle.ManagedDataAccess версии 19.10.0 приложение, которое я скачал из NuGet. Недавно я скачал Dapper, чтобы упростить код доступа к данным. Это не имеет значения. Использование ADO.net или Entity Framework найдет мои таблицы в консольном приложении, но не сможет найти таблицы в веб-приложении.

Комментарии:

1. можете ли вы проверить своего разработчика sql, сказав «Set role None» и посмотреть, можете ли вы по-прежнему выбирать из таблицы, если нет, то это означает, что доступ к выбору был предоставлен через роль, и вы можете захотеть, чтобы выбор предоставлялся напрямую, а не через роль.

2. Я выполнил эту команду, и команда select по-прежнему возвращает все данные в таблице в SQL Developer.

3. Одна вещь, которую я заметил, заключалась в том, что после запуска «Set Role None», если я нажал на имя таблицы, в окне подключений я получил сообщение об ошибке, в котором говорилось, что таблица не найдена. Я закрыл и снова открыл SQL Developer, чтобы получить новый сеанс, чтобы все вернулось в нормальное русло.

4.Существует довольно простой контрольный список для всего этого объектно-реляционного материала. 1) проверьте, какой пользователь базы данных используется для подключения (обратите внимание, что это не APP так, как очевидно из вашего комментария, то APP есть ROLE . 2) проверьте, какой оператор выбора используется. (Это можно сделать с помощью некоторых параметров трассировки, таких как show_sql=true или аналогичных; лучший способ — использовать трассировку Oracle 10046). Если у вас есть и то, и другое, вы можете выполнить проверку в SQL Developer, но вы должны подключиться к пользователю приложения и использовать точную инструкцию SQL. Удачи!

5. В моем примере имена были изменены. Я действительно не уверен, что такое «ПРИЛОЖЕНИЕ». Как я уже сказал, я не специалист по Предсказаниям. Я специалист по SQL Server. Я просто знаю, что в целом во всех существующих таблицах «ПРИЛОЖЕНИЕ» является Получателем Гранта. Я использовал технику, которую мне показал один из других разработчиков. Он добавил код в класс OracleContext(), который направлял все сообщения SQL в окно вывода. Я скопировал оператор select из этого и вставил его в SQL Developer, и он работает нормально.

Ответ №1:

Я верю, что нашел ответ на свою проблему. У меня есть Web.Config и Web.Debug.Конфигурация, содержащая строки подключения. Web.Config содержит строку подключения к рабочему серверу. Web.Debug.Config содержит строку подключения к серверу разработки.

Это просто обычная установка. Моя проблема в том, что Visual Studio не распознает код преобразования в Web.Debug.Настройте, чтобы заменить строку производственного подключения строкой подключения к разработке («< ConnectionStrings xdt:Transform=’Replace’>»)

Я не создал свои таблицы на рабочем сервере, и это является причиной ошибки.