2017-02-02 15 views
0

Я пытаюсь сделать авторизацию на основе токенов в своей службе веб-API, планируя хранить таблицы идентификации в моей базе данных Oracle.Соединение базы данных Oracle для Entity Framework

Я знаю, что есть два способа доступа к базе данных - через Oracle ManagedDataAccess или Oracle DataAccess. Я скачал управляемую версию для Entity Framework 6.

Вот часть моего web config:

(я изменил полномочия и струнный путь, просто предположим, что они правильны, и я могу подключиться без лица Framework - но только с неуправляемым DataAccess)

<oracle.manageddataaccess.client> 
    <version number="*"> 
     <dataSources> 
      <dataSource alias="Test" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))" /> 
     </dataSources> 
    </version> 
</oracle.manageddataaccess.client> 
<connectionStrings> 
    <add name="Test" 
     providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=login;Password=pass;Data Source=Test" /> 
    <clear /> 
    <add name="OraAspNetConString" connectionString=" " /> 
</connectionStrings> 
<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
      <parameter value="v13.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="Oracle.ManagedDataAccess.Client" 
        type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    </providers> 
</entityFramework> 

и это часть dbContext - OnModelCreating метод должен заставить идентичность использовать мои selfprepared таблицы (или я надеюсь, что это будет, нет возможности проверить их) :

public class AuthContext : IdentityDbContext<IdentityUser> 
{ 
    public AuthContext() : base("Test") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); // MUST go first. 

     modelBuilder.HasDefaultSchema("MY_SCHEME"); // Use uppercase! 

     modelBuilder.Entity<IdentityUser>().ToTable("AspNetUsers"); 
     modelBuilder.Entity<IdentityRole>().ToTable("AspNetRoles"); 
     modelBuilder.Entity<IdentityUserRole>().ToTable("AspNetUserRoles"); 
     modelBuilder.Entity<IdentityUserClaim>().ToTable("AspNetUserClaims"); 
     modelBuilder.Entity<IdentityUserLogin>().ToTable("AspNetUserLogins"); 
    } 

    public static AuthContext Create() 
    { 
     return new AuthContext(); 
    } 
} 

Итак ... когда я использую строку соединения с ManagedDataAccess:

<add name="Test" 
    providerName="Oracle.ManagedDataAccess.Client" 
    connectionString="User Id=login;Password=pass;Data Source=Test" /> 

Я получаю сообщение об ошибке:

ORA-12154: TNS: не удалось разрешить указан идентификатор подключения

Когда я обращаюсь к неуправляемой версии следующим образом:

<add name="Test" 
    providerName="Oracle.DataAccess.Client" 
    connectionString="User Id=login;Password=pass;Data Source=Test" /> 

Я получаю сообщение об ошибке, что Entity Framework не может найти любой dbContext имени Oracle.DataAccess.Client.

В моих других проектах я использую Oracle.ManagedDataAccess.Client, но набрав в моей строке строку Oracle.DataAccess.Client - и все работает отлично!

Простой вопрос - как подключиться к Oracle с EF6? Через управляемый и неуправляемый доступ к данным? (потому что для неуправляемого каркаса нет нумерации )

ответ

0

У меня нет четкого ответа, но следующее может помочь найти основную причину.

Oracle.ManagedDataAccess.Client и Oracle.DataAccess.Client использовать различные методы для решения псевдонимов TNS, я предполагаю, что есть проблема.

Oracle.ManagedDataAccess.Client проверяет следующее:

  1. данные псевдоним источник в секции в файле конфигурации .NET dataSources раздел под <oracle.manageddataaccess.client> (т.е. machine.config, web.config, user.config).
  2. Псевдоним источника данных в файле tnsnames.ora в месте, указанном в TNS_ADMIN, в файле конфигурации .NET. Расположение может состоять из абсолютных или относительных путей каталога.
  3. Псевдоним источника данных в файле tnsnames.ora содержится в том же каталоге, что и в .exe.

тогда Oracle.DataAccess.Client ищет tnsnames.ora файла в этих местах:

  1. переменной окружения TNS_ADMIN
  2. значение реестра HKLM\SOFTWARE\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN, соответственно. HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN
  3. Папка %ORACLE_HOME%\network\admin
  4. Текущий каталог (который может быть различным в каталог, где находится приложение)
  5. Папка, в которой расположено приложение