2017-10-05 2 views
0

Première méthode dataaccess utilisant l'API api d'entitéframework, Dev Art dans la base de données Oracle obtenant une erreur en-dessous.ORA-01450: longueur maximale de la clé (6398) dépassée (Devart.Data.Oracle.OracleException)

conception de la table réelle:

enter image description here

ce défaut de requête.

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 

mais cela fonctionne avec entityframework edmx model + devArt. Aucune suggestion?

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) 

Répondre

1
  1. S'il vous plaît activer l'outil DBMonitor et spécifier l'instruction exacte SQL qui ne parvient pas à exécuter: https://www.devart.com/dotconnect/oracle/docs/?dbmonitor.html.

  2. Essayez de définir config.CodeFirstOptions.TruncateLongDefaultNames = true. est-ce que cela aide? https://www.devart.com/dotconnect/oracle/docs/?CodeFirstOptions.html

+0

ajouté requête qui jette erreur sur Description du problème, config.CodeFirstOptions.TruncateLongDefaultNames = true n'aide pas – anand

+0

d'autres possiblités? – anand

+0

Vous utilisez l'approche Code-First (la structure de la base de données est générée en cours d'exécution), n'est-ce pas? Il existe deux autres façons de résoudre le problème: 1) mise à niveau vers 9.4.280 ou supérieure pour obtenir une solution https://www.devart.com/dotconnect/oracle/revision_history.html 9.4.280 25 -May-17 Le support des modèles EF Core avec des colonnes de chaînes, qui sont définies sans limite de longueur et participent aux PK, FK, indices, est amélioré 2) ajoute une taille de longueur à votre mapping de sorte que la longueur totale de tous les colonnes participant à PK ne dépasseraient pas la limite de 6398 – Devart

1
  • Il vous semble utiliser un oracle db de la version 9.2, 10 ou 11 avec le bloc taille 8k. Utilisez un index de clé plus petit. Vous pouvez diminuer la taille initiale de l'index lorsque vous recréez les index de votre table problématique (appelez your_table).
  • En variante, créer un espace de table avec des non-standard, la taille des blocs plus gros et créer l'index correspondant à ce tablespace, comme dans l'exemple :
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;