【问题标题】:Oracle database connection for Entity Framework实体框架的 Oracle 数据库连接
【发布时间】:2017-06-19 13:54:38
【问题描述】:

我正在尝试在我的 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.ClientdbContext

在我的其他项目中,我使用Oracle.ManagedDataAccess.Client,但在我的连接字符串中输入Oracle.DataAccess.Client - 效果很好!

简单的问题 - 如何使用 EF6 连接到 Oracle?通过托管和非托管数据访问? (因为非托管框架没有nuget 版本)

【问题讨论】:

    标签: c# oracle entity-framework-6 identity


    【解决方案1】:

    我没有明确的答案给你,但以下可能有助于找到根本原因。

    Oracle.ManagedDataAccess.ClientOracle.DataAccess.Client 使用不同的方法来解析 TNS 别名,我认为有问题。

    Oracle.ManagedDataAccess.Client 检查以下内容:

    1. .NET 配置文件中&lt;oracle.manageddataaccess.client&gt; 部分下dataSources 部分中的数据源别名(即machine.configweb.configuser.config)。
    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. 您的应用程序所在的文件夹

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多