2012-03-15 6 views
5

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

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"} 

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

Что я делаю неправильно?

ответ

6

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

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

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

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

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

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

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

+0

У меня есть как классы, так и свойства с аннотациями данных с верхним регистром Schema/ColumnName соответственно, и они все еще не работают. Однако использование DbSet.Find не работает, DbSet.SingleOrDefault() делает –

+0

Не могли бы вы поместить некоторый код из своих классов или сопоставлений? – fcaldera

+0

, казалось, был опечаткой в ​​одном из атрибутов аннотации таблицы, поэтому кажется, что DbSet.Find перемещает все классы и карты em в свои таблицы при использовании SingleOrDefault() только отображает во время выполнения необходимые таблицы для этого запроса, потому что так я заметил опечатка. Я думал, что, поскольку SingleOrDefault работал, все имена таблиц были в порядке. Короче говоря, Find отображает весь набор списков объектов DbContext. –

3

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

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

select name from persons; 

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

select "NAME" from "PERSONS"; 

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

modelBuilder.Conventions.Remove<ColumnTypeCasingConvention>(); 

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

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

Примечания

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

+0

Эй, спасибо, ответим. Проблема была в имени схемы. Это должно быть в верхнем регистре. И я согласен с вашей записью. – fcaldera

1

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

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

  1. Моих имен таблиц были множественного
  2. Моих имен таблиц были предваряются «DBO.»
0

Если вы не хотите сопоставлять каждую колонку своего приложения в качестве обходного пути для проблемы цитирования, упомянутой @fcaldera, вы можете использовать провайдер «DevCart dotConnect for Oracle».

И только следующий код необходим:

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

      config.Workarounds.DisableQuoting = true; 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^