Skip to Main Content

ODP.NET

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Scaffold-DbContext: An item with the same key has already been added.

LeChuckApr 5 2019 — edited Aug 1 2019

Hi,

I'm currently testing a bit with the new Oracle.EntityFrameworkCore nuget, now that it's finally out. I have an existing database and I wanted to create the model for it.

So I'm using

Scaffold-DbContext "my data source goes here", Oracle.EntityFrameworkCore -OutputDir Models

Then this is happening:

2019-04-05 14:28:43.229796 ThreadID:1 (SQL) OracleDatabaseModelFactory.GetColumns() : SELECT sys_context('userenv', 'current_schema') as schema, c.table_name, c.column_name, c.column_id, c.data_type, c.char_length, c.data_length, c.data_precision, c.data_scale, c.nullable, c.identity_column, c.data_default, c.virtual_column, c.hidden_column, c.user_generated FROM user_tab_cols c INNER JOIN user_tables t  ON t.table_name=c.table_name WHERE t.table_name <> '__EFMigrationsHistory'  ORDER BY c.column_id

2019-04-05 14:28:43.705787 ThreadID:1 (SQL) OracleDatabaseModelFactory.GetTriggerColumns() : select column_name from USER_TRIGGER_COLS where table_name ='AENDERUNGSPROTOKOLLIERUNG'

2019-04-05 14:28:46.883521 ThreadID:1 (MAP) OracleDatabaseModelFactory.GetTriggerColumns() : trigger column name: ID

2019-04-05 14:28:46.883571 ThreadID:1 (MAP) OracleDatabaseModelFactory.GetTriggerColumns() : trigger column name: AUFGABE

2019-04-05 14:28:46.883578 ThreadID:1 (MAP) OracleDatabaseModelFactory.GetTriggerColumns() : trigger column name: BENUTZER

2019-04-05 14:28:46.883588 ThreadID:1 (MAP) OracleDatabaseModelFactory.GetTriggerColumns() : trigger column name: TYP

2019-04-05 14:28:46.883593 ThreadID:1 (MAP) OracleDatabaseModelFactory.GetTriggerColumns() : trigger column name: ID

2019-04-05 14:28:46.897957 ThreadID:1   (ERROR)   OracleDatabaseModelFactory.GetTriggerColumns() :  System.ArgumentException: An item with the same key has already been added. Key: ID

   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetTriggerColumns(DbConnection connection, String table)

2019-04-05 14:28:46.898385 ThreadID:1   (ERROR)   OracleDatabaseModelFactory.GetColumns() :  System.ArgumentException: An item with the same key has already been added. Key: ID

   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetTriggerColumns(DbConnection connection, String table)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetColumns(DbConnection connection, String tableFilter, DatabaseModel databaseModel)

2019-04-05 14:28:46.898496 ThreadID:1   (ERROR)   OracleDatabaseModelFactory.GetTables() :  System.ArgumentException: An item with the same key has already been added. Key: ID

   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetTriggerColumns(DbConnection connection, String table)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetColumns(DbConnection connection, String tableFilter, DatabaseModel databaseModel)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetTables(DbConnection connection, Func`3 tableFilter, DatabaseModel databaseModel)

2019-04-05 14:28:46.912912 ThreadID:1   (ERROR)   OracleDatabaseModelFactory.Create() :  System.ArgumentException: An item with the same key has already been added. Key: ID

   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetTriggerColumns(DbConnection connection, String table)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetColumns(DbConnection connection, String tableFilter, DatabaseModel databaseModel)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetTables(DbConnection connection, Func`3 tableFilter, DatabaseModel databaseModel)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.Create(DbConnection connection, IEnumerable`1 tables, IEnumerable`1 schemas)

System.ArgumentException: An item with the same key has already been added. Key: ID

   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetTriggerColumns(DbConnection connection, String table)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetColumns(DbConnection connection, String tableFilter, DatabaseModel databaseModel)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.GetTables(DbConnection connection, Func`3 tableFilter, DatabaseModel databaseModel)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.Create(DbConnection connection, IEnumerable`1 tables, IEnumerable`1 schemas)

   at Oracle.EntityFrameworkCore.Scaffolding.Internal.OracleDatabaseModelFactory.Create(String connectionString, IEnumerable`1 tables, IEnumerable`1 schemas)

   at Microsoft.EntityFrameworkCore.Scaffolding.Internal.ReverseEngineerScaffolder.ScaffoldModel(String connectionString, IEnumerable`1 tables, IEnumerable`1 schemas, String namespace, String language, String contextDir, String contextName, ModelReverseEngineerOptions modelOptions, ModelCodeGenerationOptions codeOptions)

   at Microsoft.EntityFrameworkCore.Design.Internal.DatabaseOperations.ScaffoldContext(String provider, String connectionString, String outputDir, String outputContextDir, String dbContextClassName, IEnumerable`1 schemas, IEnumerable`1 tables, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames)

   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContextImpl(String provider, String connectionString, String outputDir, String outputDbContextDir, String dbContextClassName, IEnumerable`1 schemaFilters, IEnumerable`1 tableFilters, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames)

   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContext.<>c__DisplayClass0_1.<.ctor>b__0()

   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()

   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

An item with the same key has already been added. Key: ID

I don't know why you only filter on the table_name when you query USER_TRIGGER_COLS.

select column_name from USER_TRIGGER_COLS where table_name ='AENDERUNGSPROTOKOLLIERUNG'

Problem is, that this table has 2 triggers, and both use column "ID". This table shows briefly the content of USER_TRIGGER_COLS for that table:

TRIGGER_NAMETABLE_NAMECOLUMN_NAMECOLUMN_USAGE
TR$AENDPRTOAFTERAENDERUNGSPROTOKOLLIERUNGIDNEW IN
TR$AENDPRTOAFTERAENDERUNGSPROTOKOLLIERUNGAUFGABENEW IN
TR$AENDPRTOAFTERAENDERUNGSPROTOKOLLIERUNGBENUTZERNEW IN
TR$AENDPRTOAFTERAENDERUNGSPROTOKOLLIERUNGTYPNEW IN
TR$AENDPRTOBEFOREAENDERUNGSPROTOKOLLIERUNGIDNEW OUT

Would be nice if this can be fixed.

Thanks,

Markus

Comments

675595
Can you please try printing $inbound and see if the fields are properly populated.
If so then it might be some issue with XPath.
$inbound/ctx:transport/ctx:request/tp:headers/email:Subject/text()
$inbound/ctx:transport/ctx:request/tp:headers/email:Subject/*

Manoj
605614
Hi,
Thanks! Your suggestion gave me clues on what to do.

I "*Assign*"

concat('<?xml version="1.0"?>
<OracleSBMessage>
<MessageType>ApplicationEmailNotification</MessageType>
<MessageChannel>Email</MessageChannel>
<MessageSecurity>NONSSL</MessageSecurity>
<Email>
<Date>', $inbound/ctx:transport/ctx:request/tp:headers/email:Date/text(), '</Date>
<Subject>', $inbound/ctx:transport/ctx:request/tp:headers/email:Subject/text(), '</Subject>
<Importance>Normal</Importance>
<From>', $inbound/ctx:transport/ctx:request/tp:headers/email:From/text(), '</From>
<To>', $inbound/ctx:transport/ctx:request/tp:headers/email:To/text(), '</To>
<Cc>', $inbound/ctx:transport/ctx:request/tp:headers/email:Cc/text(), '</Cc>
<Body>', $body/text(), '</Body>
</Email>
</OracleSBMessage>')

"*to variable*" inboundXMLEmail

and then "*Log*" _$inboundXMLEmail_

the log file succesfully shows the current XML String as customized above.


I then created a "*Route*" which "*Route To*" a Business Service which implements a JMS endpoint address to send the message to Weblogic JMS Queue.

Upon checking the Weblogic JMS Queue, JMS Messages indeed went in. However, upon viewing the JMS Messages, the XML String created was not the body of the JMS Message, but instead the actual Microsoft Outlook HTML Format of the E-mail.

So I went back to the "*Route*", and inside the "*Request Actions*", I then "*Assign*"
<xmlns:Body>
{$inboundXMLEmail/OracleSBMessage/text()}
</xmlns:Body>

"*to variable*" body

using a user defined namespace of xmlns http://schemas.xmlsoap.org/soap/envelope/

However, upon running it, I received the following error:

####<Sep 7, 2009 11:10:06 AM SGT> <Error> <WliSbTransports> <EMCPC272> <ALSBAdminServer> <[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <BEA1-00101B49A2EC1FDC02BF> <> <1252293006324> <BEA-381014> <Error occured for endpoint ProxyService TestProject/ProxyServices/EmailProxyService
com.bea.wli.sb.transports.TransportException: ALSB Assign action failed updating variable "body": com.bea.wli.common.xquery.XQueryException: Error parsing XML: {err}XP0006: "<?xml version="1.0"?>
<OracleSBMessage>
<MessageType>EmailNotification</MessageType>
<MessageChannel>Email</MessageChannel>
<MessageSecurity>NONSSL</MessageSecurity>
<Email>
<Date>Mon Sep 07 11:10:03 SGT 2009</Date>
<Subject>TestSubject</Subject>
<Importance>Normal</Importance>
<From>Henry Wu <henry@company.com></From>
<To>Henry Wu <henry@company.com></To>
<Cc></Cc>
<Body>TestBody</Body>
</Email>
</OracleSBMessage> ({http://www.w3.org/2001/XMLSchema}string)": bad value for type node
at com.bea.wli.sb.transports.TransportException.newInstance(TransportException.java:146)
at com.bea.wli.sb.transports.TransportManagerImpl.receiveMessage(TransportManagerImpl.java:276)
at com.bea.wli.sb.transports.email.EmailPublishedTask.process(EmailPublishedTask.java:118)
at com.bea.wli.sb.transports.poller.listener.PolledMessageListenerMDB.onMessage(PolledMessageListenerMDB.java:42)
at weblogic.ejb.container.internal.MDListener.execute(MDListener.java:429)
at weblogic.ejb.container.internal.MDListener.transactionalOnMessage(MDListener.java:335)
at weblogic.ejb.container.internal.MDListener.onMessage(MDListener.java:291)
at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:4060)
at weblogic.jms.client.JMSSession.execute(JMSSession.java:3953)
at weblogic.jms.client.JMSSession$UseForRunnable.run(JMSSession.java:4467)
at weblogic.work.ServerWorkManagerImpl$WorkAdapterImpl.run(ServerWorkManagerImpl.java:518)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:181)

Hope you can help in why replacing the contents of the variable $body would not work in this conditions.

Many Thanks,
Henry
605614
Hi,
Thanks. I solved this by not changing $body, but instead have the formed XML String inserted into the a user-defined property in the transport header, then essentially the JMS Message's user-defined properties will have this XML String.

Regards,
Henry
1 - 3

Post Details

Added on Apr 5 2019
7 comments
2,180 views