保存审核表时对象多个引用IEntityTracker错误

时间:2018-07-07 05:56:54

标签: c# entity-framework audit audit.net

首先,我知道有人问过这个问题,但是我真的找不到答案,也找不到问题的根源,所以也许有人将我指向正确的方向。

我有一个IEntityChangeTracker的多个实例无法引用一个实体对象。尝试保存到日志表时出错。

对于日志表,我正在使用 https://github.com/thepirat000/Audit.NET/tree/master/src/Audit.EntityFramework

因此在我定义dbset的DbContext类中,我必须重写onscopecreated函数

这里的问题是,当context.Savechanges为每个工作的表的第一个审核记录运行时,但是在第一个记录之后,我得到了多个引用错误。

所以假设我有以下表格

语言表。具有以下值

英语,法语,德语

国家/地区表,其中包含以下值 英国,法国,德国

对于语言表,如果我将英语更改为English3并保存有效,它会记录到审核表中,但是对于语言表,我无法在任何记录中进行任何更改,因为每个表中的记录都相同

我想念什么?

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
        }

    }

0 个答案:

没有答案