2017-10-05 302 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; 
相關問題