Как настроить DbContext для работы с Oracle ODP.Net и EF CodeFirst? - PullRequest
5 голосов
/ 16 марта 2012

Я пытаюсь работать с EF CodeFirst под Oracle с ODP.net. Это мой класс DbContext:

    public class MyCEContext : DbContext {

    public DbSet<Person> Persons { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<Person>().ToTable("PERSONS","myce");

    }

    public MyCEContext() : 
        base(new OracleConnection(
            "Data Source=cebd; User ID=myce; Password=****;"), true) {}

}

Проблема в том, что когда я пытаюсь сделать что-то вроде этого:

MyCEContext context = new MyCEContext();
Person p = context.Persons.Find(1);

Я получаю эту внутреннюю ошибку:

{"ORA-00942: table or view does not exist"}

А таблица существует.

Что я делаю не так?

Ответы [ 4 ]

6 голосов
/ 26 марта 2012

Как написал Ник в своем ответе, проблема связана с кавычками и регистром сгенерированного запроса, но не с именами таблицы, а с именем схемы:

SELECT * 
FROM "myce"."PERSONS" "Extent1"

Таким образом, решение очень простоепросто в верхнем регистре идентификатор пользователя и имя схемы:

modelBuilder.Entity<Person>().ToTable("PERSONS","MYCE");

В общем, все должно быть в верхнем регистре: таблицы, схемы и имена полей.Но лучше пометить каждое сопоставленное свойство атрибутом Column, а не прописными буквами имени свойства:

    [Column("FIRST_NAME")]
    public string FirstName { get; set; }

Таким образом, имена будут легче читать как в базе данных, так и в классах.

3 голосов
/ 20 марта 2012

Ваша проблема, скорее всего, связана с тем, что EF передает запрос в Oracle в кавычках, что означает, что регистр в ваших таблицах и ваших полях должен совпадать с регистром базы данных.

Так что, если у вас было следующее:

select name from persons;

Код EF, вероятно, будет запускать следующий SQL:

select "NAME" from "PERSONS";

Добавьте это к вашей функции OnModelCreating:

modelBuilder.Conventions.Remove<ColumnTypeCasingConvention>();

... и создайте свой объект POCO с именами свойств в верхнем регистре, а не с обычным регистром отправки.

Если вы хотите увидеть SQL, разбейте код и посмотрите на объект DbContext.Persons. Вы должны увидеть саму команду sql, которую она будет использовать для запроса всей таблицы (довольно большая)

Примечание

Мы используем Oracle EF Code First в производстве. Хотя официально это не поддерживается, в последней версии ODAC, похоже, ничего не пропало.

1 голос
/ 08 марта 2013

Вы можете вызвать ToString для запроса linq, который вы запускаете для вашего объекта dbcontext. Это покажет вам генерируемый SQL. Это должно помочь вам найти проблему

Моя проблема была в два раза:

  1. Мои имена таблиц были множественными
  2. моим именам таблиц предшествовал "dbo".
0 голосов
/ 10 июля 2015

Если вы не хотите отображать каждый столбец вашего приложения в качестве обходного пути для проблемы цитирования, упомянутой @fcaldera, вы можете использовать поставщика Devart's dotConnect for Oracle.

И простонужен следующий код:

var config = Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance;

config.Workarounds.DisableQuoting = true;

Теперь вы можете без проблем сопоставить класс "MyObject" с таблицей MYOBJECT.И то же самое для столбцов.

Примечание: NuGet-версия "dotConnect for Oracle" не поддерживает Entity Framework.Необходимо загрузить пробную или профессиональную версию с сайта Devart.

...