0

私のコードのいくつかを素早くテストするために、C#インタラクティブ・ウィンドウを使用しようとしています。 DbContext(EF6)に関連するコードをテストしようとすると、問題が発生します。エンティティ・フレームワークC#インタラクティブ・ウィンドウ(Oracle)のコード・ファースト

私は、対話型ウィンドウがApp.configファイルを読み込まないため、接続文字列を渡す必要があることを理解しているので、接続文字列を指定するコンストラクタをオーバーライドしました。

ODP.NETプロバイダでOracleデータベースを使用しています。ここで

私は対話型のウィンドウ上で実行しようとしているコードです:

#r "MyProjPath\bin\Debug\CsCore.EntityDomain.dll" 
#r "MyProjPath\bin\Debug\EntityFramework.dll" 
#r "MyProjPath\bin\Debug\EntityFramework.SqlServer.dll" 
#r "MyProjPath\bin\Debug\Oracle.ManagedDataAccess.dll" 
#r "MyProjPath\bin\Debug\Oracle.ManagedDataAccess.EntityFramework.dll" 
var ctx = new CsCore.EntityDomain.Pivot.PivotContext("Data Source=MyDataSource;User Id=MyUser;Password=MyPassword;"); 
ctx.ReconciliationRules.FirstOrDefault() 

、これは私が

The underlying provider failed on Open. 
    + System.Data.Entity.Core.EntityClient.EntityConnection.Open() 
    + System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(bool) 
    + System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction<T>(Func<T>, System.Data.Entity.Infrastructure.IDbExecutionStrategy, bool, bool) 
    + System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute<TResult>(Func<TResult>) 
    + ObjectQuery<T>.GetResults(Nullable<System.Data.Entity.Core.Objects.MergeOption>) 
    + LazyEnumerator<T>.MoveNext() 
    + System.Linq.Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>) 
    + System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.ExecuteSingle<TResult>(IEnumerable<TResult>, System.Linq.Expressions.Expression) 
    + System.Data.Entity.Core.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute<TResult>(System.Linq.Expressions.Expression) 
    + System.Data.Entity.Internal.Linq.DbQueryProvider.Execute<TResult>(System.Linq.Expressions.Expression) 
    + System.Linq.Queryable.FirstOrDefault<TSource>(IQueryable<TSource>) 

マイDbContextは次のようになり得る例外です:

public class PivotContext : DbContext 
{ 
    public virtual DbSet<PivotReconciliationRule> ReconciliationRules { get; set; } 

    public PivotContext() : this("name=myConnectionStringName") 
    { 
    } 

    public PivotContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
     Database.SetInitializer<PivotContext>(null); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema("MYSCHEMA"); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

私は正しいプロバイダを指定できないという理由が考えられます。誰かがC#インタラクティブウィンドウからコードファーストのEntityFrameworkコード(oracle)を使用することができましたか?

事前に感謝します。

ニコラ

答えて

1

私はついにそれを稼働させました。

まず最初に、「基本プロバイダーが公開に失敗しました」というメッセージが表示されていました。 EFが正しいプロバイダと接続ファクトリを取得できなかったためです。実際には、Oracleの接続ファクトリではなくSqlServer接続ファクトリを使用しようとしていました。 データベースを最初に使用するアプローチでは、プロバイダーを指定するEntityConnectionからDbContextを作成できました。残念ながら、この場合、コードを最初に適用できないモデルも提供する必要があります。

最後に、this postの情報に続いてプロバイダ/工場設定を解決しました。 対応するCSXのコードは次のとおりです。タイプのプロバイダ・ファクトリのプロバイダ名を特定できません 「Oracle.ManagedDataAccess.Client.OracleClientFactory」:

System.Data.Entity.DbConfiguration.Loaded += (_, a) => 
{ 
    var services = Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.Instance; 
    a.ReplaceService<System.Data.Entity.Core.Common.DbProviderServices>((s, k) => services); 
    var factory = new Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory(); 
    a.ReplaceService<System.Data.Entity.Infrastructure.IDbConnectionFactory>((s, k) => factory); 
}; 

私はまだ、次のエラーを得たことをやった後。 ADO.NETプロバイダがアプリケーションの設定にインストールまたは登録されていることを確認します。

これは、OracleClientFactoryがエンティティ・フレームワーク・プロバイダ(「entityFramework」の項を参照)に関連付けられていなかったためです。コードから直接これを行うことはできませんでした。 configSectionsの

宣言::

<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 

configSection内容:私は最終的にできた場所でそれらのconfigsで

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
    <parameters> 
     <parameter value="mssqllocaldb" /> 
    </parameters> 
    </defaultConnectionFactory> 
    <providers> 
    <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
</entityFramework> 

<system.data> 
    <DbProviderFactories> 
    <remove invariant="Oracle.ManagedDataAccess.Client" /> 
    <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    ... other staff that was already there 
    </DbProviderFactories> 
</system.data> 

私は自分のmachine.configに "entityFramework" セクションを追加することになりましたC#の対話型ウィンドウでOracleコードの最初のEF6コードを使用する

0

まず、アプリの設定からあなたApp.Configとあなたの接続文字列を使用することができます。一般的には

var AppConfig = System.Configuration.ConfigurationManager.OpenExeConfiguration(@"bin\Debug\MyApp.exe"); 
Console.WriteLine($"Loaded {AppConfig.ConnectionStrings.ConnectionStrings.Count} connection strings"); 

を、あなたがのためにここに(あなたのDbContextでOnConfiguringメソッドを実装する必要がありますコア2.0でのpostgresql):

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{ 
    optionsBuilder.UseNpgsql("Host=localhost; Database=mydb; User ID=myuser; Password=mypasswd; Port=0000; "); 
} 

OnConfiguringあなたは、コンテキストを初めて使用するときに呼び出されます。

私はDbContextが必要です。

+0

こんにちはJimmyFL、あなたの答えに感謝します。私は質問に私のDbContextを入れました。私はApp.configを取得することができますが、C#インタラクティブはそれを使用せず、コードからDbContextを設定する必要があります。また、私が見る限りでは、OnConfiguringメソッドは、EF6ではなくEFCore用です。 –

関連する問題