2017-10-05 141 views
0

第一个使用entityframework fluent api的数据访问方法,Dev Art在Oracle数据库中获取低于错误的数据。ORA-01450:超出最大密钥长度(6398)(Devart.Data.Oracle.OracleException)

实际的表设计:

enter image description here

此查询失败。

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 

但它适用于entityframework edmx model + 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) 

回答

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

+0

加入查询其抛出错误上问题描述,config.CodeFirstOptions.TruncateLongDefaultNames = true does not帮助 – anand

+0

任何其他可能性? – anand

+0

您正在使用代码优先方法(数据库结构是在运行时生成的),是不是? 有两种可选的方法来解决这一问题: 1)升级到9.4.280或更高,以获得一个修复 https://www.devart.com/dotconnect/oracle/revision_history.html 9.4.280 25 -May-17 对带有字符串列的EF核心模型的支持(定义为没有长度限制并且参与PK,FK,索引)得到了改进 2)为您的映射添加长度大小,以便所有长度列参与PK的人不会超过6398的限制 – Devart

1
  • 看来您使用的是Oracle数据库的9.2版,10或11块 大小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; 
相关问题