source

Oracle.ManagedDataAccess.엔티티 프레임워크 - ORA-01918: 사용자 'dbo'가 존재하지 않습니다.

factcode 2023. 7. 3. 23:23
반응형

Oracle.ManagedDataAccess.엔티티 프레임워크 - ORA-01918: 사용자 'dbo'가 존재하지 않습니다.

Oracle을 사용한 코드 퍼스트 마이그레이션을 구현하려고 합니다.ManagedDataAccess 6.121.1.0 공급자이지만 전혀 성공하지 못했습니다.

저는 ORA 코드를 받고 있기 때문에 연결이 성공적으로 열렸다고 생각합니다.그러나 공급자가 Oracle이 아닌 SQL Server로 동작하기 때문에 마이그레이션이 실패하고 있습니다.기본 스키마로 'dbo'를 사용하기 위한 트레이딩이기 때문이라고 생각합니다.

다음은 내 web.config 설정입니다.

<configuration>
  <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.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>
  <entityFramework>
    <contexts>
      <context type="MyProject.Context.MainContext, MyProject.Context">
        <databaseInitializer type="MyProject.Context.Config.ContextInitializer, MyProject.Context" />
      </context>
    </contexts>
    <defaultConnectionFactory type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess" />    
    <providers>    
      <provider invariantName="Oracle.ManagedDataAccess.Client" 
                type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </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.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="MainContext"
         providerName="Oracle.ManagedDataAccess.Client"
         connectionString="Data Source=OracleServer:1521/BRSYSDS;User ID=USER;Password=PASSWORD;" />
  </connectionStrings>
  <!-- other settings -->
</configuration>

스택 추적:

[Oracle 예외(0x77e):ORA-01918: 사용자 'dbo'가 존재하지 않습니다]
오라클 내부.서비스 개체입니다.Oracle Command Impl.실행을 확인합니다(OracleConnectionImppl connectionImppl, Int32&cursorId, 부울 bThrowArrayBindRelatedErrors, OracleException&exceptionForArrayBindDML, 부울 & hasMoreRowsInDB, 부울 BirstiterationDone) + 652 Oracle 내부.서비스 개체입니다.Oracle Command Impl.실행 확인(OracleConnectionImpleconnectionImppl, Int32&cursorId, 부울 bThrowArrayBind관련오류, OracleException&exceptionForArrayBindDML, 부울 bFirstEatationDML) +39
오라클 내부.서비스 개체입니다.Oracle Command Impl.ExecuteNonQuery(String 명령)텍스트, Oracle 매개변수 집합 paramColl, 명령명령어 입력유형, Oracle Connection Impl 연결 Impl, Int32 longFetchSize, Int64 클라이언트초기 LOBFS, OracleDependencyImpl, Int64[]& scn실행에서, Oracle 매개 변수 수집&bindBaseParamColl, Boolean&bindParamParamPresent, OracleExceptionForArrayBindDML, BooleanIsFromEF) +7480
오라클.관리 데이터 액세스.Client.Oracle Command.비쿼리 실행() +678
시스템.데이터. 엔티티.사회 기반 시설.가로채기.DbCommandDispatcher입니다.b__0(DbCommandt, DbCommand)가로채기 컨텍스트1 c) +10
System.Data.Entity.Infrastructure.Interception.InternalDispatcher
1.파견(Target Target Target, Func)3 operation, TInterceptionContext interceptionContext, Action3 실행, 액션3 executed) +72
System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) +357
System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() +104
System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext) +152
System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable
1 migrationStatement, DbTransaction트랜잭션, DbInterceptionContextinterceptionContext) +82
시스템.데이터. 엔티티.마이그레이션.DbMigrator입니다.명령문 실행내부(IEnumberable1 migrationStatements, DbConnection connection) +626
System.Data.Entity.Migrations.<>c__DisplayClass30.<ExecuteStatements>b__2e() +19
System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute(Action operation) +9
System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable
1개의 마이그레이션 문, DbTransaction existingTransaction) +194
시스템.데이터. 엔티티.마이그레이션.DbMigrator입니다.명령문 실행(IEnumberable)1 migrationStatements) +7
System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable
의 연산,의 연산, IEnumberable1의 연산1 systemOperations, Boolean downgrading, Boolean auto) +825
System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading) +564
System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable
lastMigrationId) + 파일 이름, 파일 이름, 파일 이름, 파일 이름 및 파일 이름: +404
시스템.데이터. 엔티티.파일 이름은 .DbMigrator입니다. targetMigration) +(문자열 대상 ) +447
시스템.데이터. 엔티티.파일 이름 c +<>c__DisplayClass c.b_b() +13
시스템.데이터. 엔티티.파일 이름은 .DbMigrator입니다.하는지 합니다(Action Success(은 성공해야 +422 데이터베이스 유지) +422
시스템.데이터. 엔티티.파일 이름은 .DbMigrator입니다. 대상 +78문자열 대상 마이그레이션) +78
시스템.데이터. 엔티티.데이터베이스입니다.데이터베이스 작성자.(InternalContext , Func 작성3 createMigrator, ObjectContext objectContext) +89
System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext, DatabaseExistenceState existenceState) +116
System.Data.Entity.Database.Create(DatabaseExistenceState existenceState) +218
System.Data.Entity.DropCreateDatabaseAlways
초기화(1.데터베스초기화 ( + TC +137

저도 같은 문제가 있었는데 티아고 루나디의 답변으로 해결되었습니다.감사해요.저는 당신의 답변에 투표하기에 충분한 평판을 얻지 못했습니다.여기에 언급하자면, 저는 제 스키마 이름을 대문자로 설정한 후 성공했습니다.

새 dbContext 클래스 아래의 컨텍스트 파일에 다음과 같이 입력합니다.

public partial class MyAppContext : DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("UPPERCASE_SCHEMA_NAME");
...

modelBuilder에서 기본 스키마를 설정하는 것만으로 이 문제를 해결합니다.

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

    // ...
}

기본 스키마 설정이 작동하지 않았습니다.마이그레이션 기록 테이블을 사용자 정의하여 다른 스키마를 설정하여 해결책을 찾았습니다.

여기에서 해결책을 찾을 수 있습니다: LINK.

사용자 Dbo는 테이블의 정규화된 이름이 없는 경우에도 제공됩니다.데이터베이스의 오른쪽 표에 매핑되지 않을 수 있습니다.

enter image description here

이전과 같이 자동 마이그레이션을 사용하는 경우 다음 사항을 참고하십시오.modelBuilder.HasDefaultSchema명시적 마이그레이션으로 전환하기 전까지는 도움이 되지 않습니다.

Oracle Docs에서:

코드 첫 번째 자동 마이그레이션은 다음과 같이 작업하는 것으로 제한됩니다.dbo 스키마만.이러한 제한 때문에 코드 기반 마이그레이션, 즉 마이그레이션 추가 명령을 통해 명시적 마이그레이션을 추가하는 것이 좋습니다.

코드 먼저 표의 데이터 주석을 사용할 수 있습니다.

[테이블("사원", Schema=")"""스키마 이름"]

저도 같은 문제가 있었습니다.스키마 이름을 OnModelCreating() 메서드에 배치했습니다.

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

    // ...
}

하지만 저는 대문자로 스키마 이름을 설정할 수 없었습니다.Confifuration.cs 에 아래 언급된 코드를 추가했는데 작동했습니다!!

마이그레이션 -> Configuration.cs 으로 이동합니다.

 class Configuration : DbMigrationsConfiguration<CodeFirstOracleProject.Context>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (dbc, schema) => historyContextFactory.Invoke(dbc, "YourSchemaName"));
    }
}

.toUpper()다음과 같은 기능을 합니다.

 modelBuilder.HasDefaultSchema("YOURSCHEMA".ToUpper())

덧셈과 함께

   public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (dbc, schema) => historyContextFactory.Invoke(dbc, "YOURSCHEMA".ToUpper()));
    }

마이그레이션을 제거하고 다시 생성하여 문제를 해결했습니다.

초보자로서, 제가 여기서 대답한 주요 문제는 사용자 'dbo'가 스키마 이름과 무슨 관련이 있느냐는 것이었습니다.

조사한 결과, 제가 발견한 것은 다음과 같습니다.

오라클에서 스키마는 데이터베이스 개체의 모음입니다.스키마는 데이터베이스 사용자가 소유하며 사용자와 이름이 같습니다.

그러나 엔티티 프레임워크의 기본 스키마는 dbo이며 아래 코드 목록에서와 같이 이 스키마를 재정의할 수 있습니다.

  modelBuilder.HasDefaultSchema("YOURSCHEMA".ToUpper())

오라클의 경우 "YOURSCHEMA"가 연결된 데이터베이스의 user_id여야 합니다.

그런 다음 아래를 구성 파일에 추가해야 합니다.

public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (dbc, schema) => historyContextFactory.Invoke(dbc, "YOURSCHEMA".ToUpper()));
    }

마지막으로 생성된 마이그레이션 파일을 삭제하고 마이그레이션 추가를 다시 실행합니다.

이것이 누군가에게 도움이 되기를 바랍니다.

언급URL : https://stackoverflow.com/questions/27250555/oracle-manageddataaccess-entityframework-ora-01918-user-dbo-does-not-exist

반응형