0

非常によく似た質問がhereと尋ねられましたが、その答えが私を助けませんでした。キー 'データソース'の値の長さが '128'の制限を超えています

私はOracle.ManagerDataAccess.ClientでEntity Framework 6を​​使用しています。

app.configで接続文字列を定義すると、接続が機能します。 私はコード内の同じ接続文字列を指定した場合、私は正しいエラー

The value's length for key 'data source' exceeds it's limit of '128'. 

を取得します。

は、これが私の接続文字列です(取り除いいくつかの名前付き):

"User Id=xxxxxxxxxxx;Password=xxxx;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = VS-ORACLE.xxxxxxx.de)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl.xxxxxxxx.de)))" 

私は除去することができ、スペースの束があることを知っているが、私はまだダウン128以下の文字列を取得するつもりはありません文字。

接続文字列がapp.configにあるときはどうなりますが、コードには含まれていません。

いくつかのパラメータを別の文字列にオフロードすることで、私が使用できるトリックはありますか?

私はすでにDBConfigurationオブジェクトを使用しています。そのオブジェクトのいくつかのパラメータを設定する方法はありますか?

完全なoracleクライアントを使用している場合は、tnsnames.oraファイルで構成を参照できると思いますが、フル・クライアントなしでoracleデータベースと通信できる場合は大きな利点になります。

[DbConfigurationType(typeof(OracleDBConfiguration))] 
public class GlobalAttributeContext : DbContext 
{ 
    public DbSet<GlobalAttribute> GlobalAttributes { get; set; } 

    static GlobalAttributeContext() 
    { 
    Database.SetInitializer<GlobalAttributeContext>(null); 
    } 

    public GlobalAttributeContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
    } 

    public GlobalAttributeContext() : this ("Name=OracleDbContext") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    // We have to pass the schema name into the configuration. (Is there a better way?) 
    modelBuilder.Configurations.Add(new GlobalAttribute_Config_Oracle("SchemaName")) ; 
    } 
} 

私が持っている:

アップデートは

これは、接続文字列は次のように私はコンテキストクラスを定義しているコードで

<connectionStrings> 
    <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=xxxxxxxxxxx;Password=xxxx;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = VS-ORACLE.xxxxxxxx.de)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl.xxxxxxxx.de)))" /> 
</connectionStrings> 

app.configをで次のようになります次のようにDbConfigurationクラスを定義しました。

class OracleDBConfiguration : DbConfiguration 
{ 
    public OracleDBConfiguration() 
    { 
    this.SetDefaultConnectionFactory (new System.Data.Entity.Infrastructure.LocalDbConnectionFactory("v12.0")) ; 
    this.SetProviderServices ("Oracle.ManagedDataAccess.Client", Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.Instance) ; 
    this.SetProviderFactory ("Oracle.ManagedDataAccess.Client", Oracle.ManagedDataAccess.Client.OracleClientFactory.Instance) ; 
    } 
} 

は最後に、私は2つの方法で使用される接続文字列が同一である。この

string ConnectionString = "User Id=xxxxxxxxxxx;Password=xxxx;Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = VS-ORACLE.xxxxxxxx.de)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl.xxxxxxx.de)))" ; 

using (var ctx = new GlobalAttributeContext(ConnectionString)) 
{ 
    var globalAttributes = ctx.GlobalAttributes.ToList() ; 
    foreach (GlobalAttribute ga in globalAttributes) 
    { 
    Console.WriteLine ("Name: {0}, Value: {1}", ga.Attribute, ga.Value) ; 
    } 
} 

のようなコンテキストを作成します。

+0

コードで接続文字列をどのように設定していますか?以前は接続文字列でこのエラーを見たことがありません。 – bhmahler

+0

私はより多くの情報を追加しました。 –

答えて

1

私の同僚は、この問題に対する答えを見つけた参照、.configファイルでも、別名を定義することができます

は、既存のコレクションを使用するコンテキストクラスに別のコンストラクタを追加します。

public GlobalAttributeContext(DbConnection existingConnection, bool contextOwnsConnection) 
     : base(existingConnection, true) 
{ 
} 

これは完全なコンテキストクラス

namespace OracleTestExeConfigAndConnStr 
{ 
    [DbConfigurationType(typeof(OracleDBConfiguration))] 
    public class GlobalAttributeContext : DbContext 
    { 
    public DbSet<GlobalAttribute> GlobalAttributes { get; set; } 

    static GlobalAttributeContext() 
    { 
     Database.SetInitializer<GlobalAttributeContext>(null); 
    } 

    public GlobalAttributeContext() : base("OracleDbContext") 
    { 
    } 

    public GlobalAttributeContext(string nameOrConnectionString) 
      : base(nameOrConnectionString) 
    { 
    } 

    public GlobalAttributeContext(DbConnection existingConnection, bool contextOwnsConnection) 
      : base(existingConnection, true) 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // We have to pass the schema name into the configuration. (Is there a better way?) 
     modelBuilder.Configurations.Add(new GlobalAttribute_Config_Oracle("SchemaName")) ; 
    } 
    } 
} 

は別のステップとしてデータベース接続を作成し、コンテキストオブジェクトへの接続を渡しています。

string connStr = @"User Id=xxxxxxxxxxx;Password=xxxx;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=VS-ORACLE.xxxxxxxx.de)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl.xxxxxxxx.de)))"; 

using (var connection = new OracleConnection() { ConnectionString = connStr }) 
{ 
    connection.Open(); 
    using (var ctx = new GlobalAttributeContext(connection, true)) 
    { 
    var globalAttributes = ctx.GlobalAttributes.ToList(); 
    foreach (GlobalAttribute ga in globalAttributes) 
    { 
     Console.WriteLine("Name: {0}, Value: {1}", ga.Attribute, ga.Value); 
    } 
    } 
} 

完全性のために、これはコンテキストクラスの属性として指定されたDBConfigurationクラスです。

class OracleDBConfiguration : DbConfiguration 
{ 
    public OracleDBConfiguration() 
    { 
    this.SetDefaultConnectionFactory (new System.Data.Entity.Infrastructure.LocalDbConnectionFactory("v12.0")) ; 
    this.SetProviderServices ("Oracle.ManagedDataAccess.Client", Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.Instance) ; 
    this.SetProviderFactory ("Oracle.ManagedDataAccess.Client", Oracle.ManagedDataAccess.Client.OracleClientFactory.Instance) ; 
    } 
} 

このメソッドは、app.configに値を指定することなくDLLから機能します。

0

tnsnames.oraファイルを使用するためにOracle Clientは必要ありません。

ODP.NET Managed Driverフォルダがtnsnames.oraを予期しているthis answer(最後の段落)を参照してください。 sqlnet.oraファイル。

あなたは次のようにConfiguring Oracle Data Provider for .NET

+0

複数のアプリケーションで使用されるクラスライブラリにデータアクセスをカプセル化したいので、app.configファイルを使用しないでください。データベース接続は独立して構成され、格納されます。 –

+0

app.configファイルを使用する必要はなく、単なるオプションです。指定されたいずれかの方法でtnsnames.oraファイルの場所を指定すれば、完了です。 –

+0

ありがとう、私は簡単にそれを試み、失敗しました。私はもう一度やり直します。 –

関連する問題