【问题标题】:ORA-01450: maximum key length (6398) exceeded (Devart.Data.Oracle.OracleException)ORA-01450: 超过最大密钥长度 (6398) (Devart.Data.Oracle.OracleException)
【发布时间】:2017-10-05 18:21:14
【问题描述】:

使用entityframework fluent api的第一个数据访问方法,oracle数据库中的Dev Art出现以下错误。

实际表设计:

此查询失败。

  CREATE TABLE DADeskSettings ( 
  UserID NVARCHAR2(2000) NOT NULL,
  Password NVARCHAR2(2000) NOT NULL,
  DADeskURL NVARCHAR2(2000) NOT NULL,
  WebURL NVARCHAR2(2000) NOT NULL,
  IsDADeskSettings NUMBER(1) NOT NULL,
  DAType VARCHAR2(4 CHAR) NOT NULL,
  UPDATEDADESK NUMBER(1) NOT NULL,
  isshortseavoy NUMBER(1) NULL,
  CreatedBy VARCHAR2(8 CHAR) NULL,
  UpdatedBy VARCHAR2(8 CHAR) NULL,
  CONSTRAINT PK_DADeskSettings PRIMARY KEY (UserID, Password, DADeskURL, WebURL, IsDADeskSettings, DAType)
)

ORA-01450: maximum key length (6398) exceeded

但它适用于实体框架 edmx 模型 + devArt。有什么建议吗?

var dummy2 = ContextFactory.Db.GetQuery<OPRPortCall>().Select(x=>x.AccountCode).FirstOrDefault(); //this is one of the line.


    *** Client Application Says ***

- ORA-01450: maximum key length (6398) exceeded  (Devart.Data.Oracle.OracleException)

- The type initializer for 'Server.ManagerService.Registers.LookupVmSvc' threw an exception.  (System.TypeInitializationException)

- Exception has been thrown by the target of an invocation.  (System.Reflection.TargetInvocationException)



Stacktrace 
*** Client Application Says ***

   at Devart.Data.Oracle.bh.d(Int32 A_0)
   at Devart.Data.Oracle.de.a(Int32 A_0, z A_1)
   at Devart.Data.Oracle.OracleCommand.InternalExecute(CommandBehavior behavior, IDisposable disposable, Int32 startRecord, Int32 maxRecords, Boolean nonQuery)
   at Devart.Common.DbCommandBase.ExecuteDbDataReader(CommandBehavior behavior, Boolean nonQuery)
   at Devart.Data.Oracle.OracleCommand.ExecuteNonQuery()
   at Devart.Common.Entity.ej.a(DbConnection A_0, Nullable`1 A_1, b3 A_2)
   at Devart.Common.Entity.ej.a(DbConnection A_0, Nullable`1 A_1)
   at Devart.Data.Oracle.Entity.OracleEntityProviderServices.DbCreateDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection)
   at System.Data.Entity.Internal.DatabaseOperations.Create(ObjectContext objectContext)
   at System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func`3 createMigrator, ObjectContext objectContext)
   at System.Data.Entity.Database.Create(DatabaseExistenceState existenceState)
   at System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context)
   at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
   at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
   at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.AsNoTracking()
   at System.Data.Entity.Infrastructure.DbQuery`1.AsNoTracking()
   at Server.Manager.DataAccess.VMEntities.GetQuery[T](Boolean tracking)

【问题讨论】:

    标签: oracle entity-framework-6 devart


    【解决方案1】:
    1. 请启用 dbMonitor 工具并指定执行失败的确切 SQL 语句:https://www.devart.com/dotconnect/oracle/docs/?dbmonitor.html

    2. 尝试设置 config.CodeFirstOptions.TruncateLongDefaultNames=true。这有帮助吗? https://www.devart.com/dotconnect/oracle/docs/?CodeFirstOptions.html

    【讨论】:

    • 添加了在问题描述上引发错误的查询,config.CodeFirstOptions.TruncateLongDefaultNames=true 没有帮助
    • 还有其他可能吗?
    • 您使用的是代码优先方法(数据库结构是在运行时生成的),不是吗?有两种替代方法可以解决此问题:1) 升级到 9.4.280 或更高版本以获得修复 devart.com/dotconnect/oracle/revision_history.html 9.4.280 25-May-17 支持带有字符串列的 EF Core 模型,这些列的定义没有长度限制并参与 PK、FK、索引,得到改进 2) 为您的映射添加长度大小,以便参与 PK 的所有列的总长度不会超过 6398 限制
    • 不,我们不使用代码优先方法。数据库已经存在。我们只使用 fluent api 进行映射和配置。使用管理员帐户运行的应用程序。
    • 这里是 OnModelCreating 方法中流畅映射的示例:builder.Entity() .Property(p => p.YourPropertyName) .HasMaxLength(YourValue);
    【解决方案2】:
    • 看来您使用的是 9.2、10 或 11 版的 oracle db 和块 大小 8k。使用较小的键索引。您可以减小初始大小 索引,当您重新创建有问题的表的索引时(调用 your_table )。
    • 或者,创建一个具有非标准、更大块大小的表空间和 在该表空间上创建相应的索引,就像在 示例:
    SQL> create tablespace TS_DATA_16 datafile '+DATA' size 100M blocksize 16k;
    SQL> alter user your_schema quota unlimited on TS_DATA_16;
    SQL> drop table your_table;
    SQL> create table your_table
         (
          ...
         )
          tablespace TS_DATA_16;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2016-04-15
      • 2010-11-05
      • 2011-09-03
      相关资源
      最近更新 更多