1

first I know this question has been asked but I really couldn't find an answer nor find the root of the problem so maybe a someone points me in the right direction.

I'm having the An entity object cannot be referenced by multiple instances of IEntityChangeTracker. error when trying to save into the log tables.

for the log table, I'm using https://github.com/thepirat000/Audit.NET/tree/master/src/Audit.EntityFramework

so inside my DbContext class where I define the dbset, I have to override the onscopecreated function

the problem here is that when context.Savechanges run for the first audit record for each table it works but after first record, I get the multiple reference error.

so let's say I have the following tables

Languages table. with the following values

English,French,German

Countries Table with the following values UK,France,Germany

for languages table, if I change English to English3 and save it works It records to the audit table but then for languages table, I can not do any changes at any records it's the same in every table

what am I missing?

private void SaveToLogTable(AuditScope auditScope)
    {
        foreach (var entry in ((AuditEventEntityFramework)auditScope.Event).EntityFrameworkEvent.Entries)
        {
            if(entry.Action is null) return;

            if (TABLES.Any(x => x.T_TABLE_NAME.Equals(entry.Table)))
            {
                var newLog = new LOGS
                {
                    LOG_ACTION = ACTIONS.FirstOrDefault(x => x.A_DESC == entry.Action)?.A_CODE,
                    LOG_DATE = DateTime.Now,
                    USERS = MyGlobalSettings.MyUser
                };

                if (entry.Changes != null)
                {
                    foreach (var changes in entry.Changes)
                    {
                        var ch = new CHANGES
                        {
                            CH_COLUMN = changes.ColumnName,
                            CH_NEW_VALUE = changes.NewValue.ToString(),
                            CH_ORIGINAL_VALUE = changes.OriginalValue.ToString()
                        };
                        newLog.CHANGES.Add(ch);
                    }
                }

                if (entry.ColumnValues != null)
                {
                    foreach (var kv in entry.ColumnValues)
                    {
                        var val = new VALUES
                        {
                            ColumnName = kv.Key,
                            ColumnValue = kv.Value.ToString()
                        };

                        newLog.VALUES.Add(val);
                    }
                }

                TABLES.First(x => x.T_TABLE_NAME.Equals(entry.Table)).LOGS.Add(newLog);
            }
            else
            {
                var table = new TABLES {T_TABLE_NAME = entry.Table};
                var newLog = new LOGS
                {
                    LOG_ACTION = ACTIONS.FirstOrDefault(x => x.A_DESC.Equals(entry.Action))?.A_CODE,
                    LOG_DATE = DateTime.Now,
                    LOG_USER_REFNO =  MyGlobalSettings.MyUser.U_ROWID
                    //USERS = MyGlobalSettings.MyUser
                };

                if (entry.Changes != null)
                {
                    foreach (var changes in entry.Changes)
                    {
                        var ch = new CHANGES
                        {
                            CH_COLUMN = changes.ColumnName,
                            CH_NEW_VALUE = changes.NewValue.ToString(),
                            CH_ORIGINAL_VALUE = changes.OriginalValue.ToString()
                        };
                        newLog.CHANGES.Add(ch);
                    }
                }

                if (entry.ColumnValues != null)
                {
                    foreach (var kv in entry.ColumnValues)
                    {
                        var val = new VALUES
                        {
                            ColumnName = kv.Key,
                            ColumnValue = kv.Value is null? "": kv.Value.ToString()
                        };

                        newLog.VALUES.Add(val);
                    }
                }
                table.LOGS.Add(newLog);

                //TABLES.Attach(table);
                //TABLES.First(x => x.T_TABLE_NAME.Equals(entry.Table)).LOGS.Add(newLog);
                TABLES.Add(table);
                //TablesList.Add(table);
            }
            //entry.Entity
        }

    }
thepirat000
  • 12,362
  • 4
  • 46
  • 72
Asım Gündüz
  • 1,257
  • 3
  • 17
  • 42
  • Many Thanks to English Language association for fixing the grammer issues, I'll be glad if any coders could help me <3 – Asım Gündüz Jul 07 '18 at 15:53
  • share the exception message and stacktrace. I guess second saving is failing because of the entities you added on `SaveToLogTable`. Why don't you execute `dbContext.Save()` there? – thepirat000 Jul 13 '18 at 05:27

0 Answers0