0

C# 대화식 창을 사용하여 일부 코드를 신속하게 테스트하려고합니다. DbContext (EF6)와 관련된 코드를 테스트하려고 할 때 문제가 발생합니다.엔티티 프레임 워크 C# 대화식 창 (Oracle)의 코드 - 첫 번째

대화 형 창이 App.config 파일을로드하지 않으므로 연결 문자열을 전달해야하므로 연결 문자열을 지정하는 생성자를 재정의했습니다.

오라클 데이터베이스를 ODP.NET 제공 업체와 함께 사용하고 있습니다.

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); 
    } 
} 
: 나는

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는 다음과 같습니다 얻을

#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() 

이 예외입니다 : 여기

내가 대화 창에서 실행하기 위해 노력하고있어 코드입니다

이유는 올바른 공급자를 지정할 수 없다고 생각합니다. 누군가가 C# 대화식 창에서 코드 우선 EntityFramework 코드 (oracle)를 사용하고 있습니까?

미리 감사드립니다. 당신은 (여기에 대한 DbContext의 OnConfiguring 방법을 구현해야 일반적으로

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

: 모든

니콜라

답변

1

나는 마침내 그것을 작동시킬 수 있었다.

우선 "기본 공급자가 공개에 실패했습니다."라는 메시지가 나타납니다. EF가 올바른 공급자 및 연결 팩토리를 얻을 수 없었기 때문입니다. 사실 오라클의 연결 팩토리 대신 SqlServer 연결 팩토리를 사용하려고했습니다. 데이터베이스 우선 접근 방식에서는 공급자를 지정하는 EntityConnection에서 DbContext를 만들 수 있습니다. 불행하게도이 경우에는 코드 우선으로는 적용 할 수없는 모델을 제공해야합니다.

결국 나는 this post에 infos에 이어 제공 업체/공장 설정을 해결했습니다. 해당 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"섹션을 추가 결국 오라클 코드 첫 번째 EF6 코드를 C# 대화식 창에서 사용합니다.

0

첫째, 당신은 앱 설정에서 App.Config 및 연결 문자열을 사용할 수 있습니다 코어 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 방법은 EFCore가 아닌 EFCore를위한 방법입니다. –