簡體   English   中英

實體框架的Oracle數據庫連接

[英]Oracle database connection for Entity Framework

我正在嘗試在Web API服務中進行基於令牌的授權,並計划將身份表存儲在Oracle數據庫中。

我知道有兩種訪問數據庫的方法-通過Oracle ManagedDataAccess或Oracle DataAccess。 我已經下載了Entity Framework 6的托管版本。

這是我的web config的一部分:

我已經修改了憑據和字符串路徑,只是假設它們是正確的,並且我可以在沒有實體框架的情況下進行連接-但僅限於非托管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方法應該強制身份使用我自己准備的表(或者我希望這樣做,沒有機會對其進行測試):

 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無法找到任何名為Oracle.DataAccess.Client dbContext

在我的其他項目中,我使用的是Oracle.ManagedDataAccess.Client ,但是在我的連接字符串中鍵入Oracle.DataAccess.Client一切正常!

一個簡單的問題-如何使用EF6連接到Oracle? 通過托管和非托管數據訪問? (因為非托管框架版本沒有裸露)

我沒有明確的答案,但以下內容可能有助於找到根本原因。

我假設Oracle.ManagedDataAccess.ClientOracle.DataAccess.Client使用不同的方法來解析TNS別名。

Oracle.ManagedDataAccess.Client檢查以下內容:

  1. .NET配置文件(即machine.configweb.configuser.config )的<oracle.manageddataaccess.client>部分下的dataSources部分中的數據源別名。
  2. tnsnames.ora文件中.NET配置文件中TNS_ADMIN指定的位置的數據源別名。 位置可以包含絕對或相對目錄路徑。
  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. 應用程序所在的文件夾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM