为什么 Audit.NET 为 AuditContext 获取本地 DbContext 来记录数据

问题描述

我必须将多个项目的审计数据记录到一个公共数据库中。我是这样做的。

Global.asax.cs

    string connectionString = ConfigurationManager.AppSettings["AuditTrailDatabase"].ToString();
        string module = ConfigurationManager.AppSettings["Module"].ToString();

        AuditConfig.Configuration.Setup()
            .UseCustomProvider(new SinglesqlProvider(config =>
            config.ConnectionString(connectionString)
            .Schema("dbo")
            .IdColumnName("EventId")
            .TableName("AuditTrailMain")
            .JsonColumnName("JsonData")
            .CustomColumn("GUID",ev => Guid.NewGuid())
            .CustomColumn("TransactionId",ev => ev.CustomFields.First().Value.ToString())
            .CustomColumn("InterfaceName",ev => module)
            .CustomColumn("DatabaseName",ev => ev.GetEntityFrameworkEvent().Database.ToString())
            .CustomColumn("SchemaName",ev => ev.GetEntityFrameworkEvent().Entries[0].Schema.ToString())
            .CustomColumn("TableName",ev => ev.GetEntityFrameworkEvent().Entries[0].Table.ToString())
            .CustomColumn("Action",ev => ev.GetEntityFrameworkEvent().Entries[0].Action.ToString())
            .CustomColumn("keyvalue",ev => ev.GetEntityFrameworkEvent().Entries[0].PrimaryKey.First().Value)
            .CustomColumn("FieldName",ev =>
            (ev.GetEntityFrameworkEvent().Entries[0].Action.ToString() == "Update") ?
            ev.GetEntityFrameworkEvent().Entries[0].Changes[0].ColumnName.ToString() : ((ev.GetEntityFrameworkEvent().Entries[0].Action.ToString() == "Insert") ?
            ev.GetEntityFrameworkEvent().Entries[0].ColumnValues.First().Key.ToString() : null))
            .CustomColumn("OldFieldValue",ev =>
            (ev.GetEntityFrameworkEvent().Entries[0].Action.ToString() == "Update") ?
            ((ev.GetEntityFrameworkEvent().Entries[0].Changes[0].OriginalValue != null) ?
            ev.GetEntityFrameworkEvent().Entries[0].Changes[0].OriginalValue.ToString() : null) : null)
            .CustomColumn("NewFieldValue",ev => ev.GetEntityFrameworkEvent().Entries[0].Action.ToString() == "Update" ?
            (ev.GetEntityFrameworkEvent().Entries[0].Changes[0].NewValue != null ?
            ev.GetEntityFrameworkEvent().Entries[0].Changes[0].NewValue.ToString() : null) :
            (ev.GetEntityFrameworkEvent().Entries[0].Action.ToString() == "Insert" ?
            (ev.GetEntityFrameworkEvent().Entries[0].ColumnValues != null ?
            (ev.GetEntityFrameworkEvent().Entries[0].ColumnValues.First().Value != null ?
            ev.GetEntityFrameworkEvent().Entries[0].ColumnValues.First().Value.ToString() : null) : null) : null))
            .CustomColumn("CreatedDate",ev => Convert.ToDateTime(ev.StartDate))
            .CustomColumn("UserDate",ev => Convert.ToDateTime(DateTime.Now))
            .CustomColumn("UserDateUTC",ev => Convert.ToDateTime(DateTime.UtcNow))
            .CustomColumn("UTCDateCreated",ev => Convert.ToDateTime(DateTime.UtcNow))
            ));

类如下业务层。 SinglesqlDataProvider.cs

    public class SinglesqlProvider: sqlDataProvider
{
    public SinglesqlProvider(Action<IsqlServerProviderConfigurator> config) : base(config) { }

    public override object InsertEvent(AuditEvent auditEvent)
    {
        var efEvent = auditEvent as AuditEventEntityFramework;
        object lastId = null;
        var cloneChanges = new List<EventEntry>();
        int increment = 0;
        var newGuid = Guid.NewGuid().ToString();

        if (efEvent != null)
        {
            foreach (var entry in efEvent.EntityFrameworkEvent.Entries)
            {
                var clone = AuditEvent.FromJson<AuditEventEntityFramework>(auditEvent.ToJson());
                var clone2 = AuditEvent.FromJson<AuditEventEntityFramework>(auditEvent.ToJson());

                if (entry.Changes != null && entry.Changes.Count > 0)
                {
                    cloneChanges.Clear();
                    cloneChanges.Add(clone2.EntityFrameworkEvent.Entries[increment]);

                    // cloneChanges.Add(entry);
                    foreach (var item in entry.Changes)
                    {
                        cloneChanges[0].Changes.Clear();
                        cloneChanges[0].Changes.Add(item);
                        clone.EntityFrameworkEvent.Entries.Clear();
                        clone.EntityFrameworkEvent.Entries.Add(cloneChanges[0]);
                        clone.CustomFields = new Dictionary<string,object>();
                        clone.CustomFields.Add("TransactionId",newGuid);
                        lastId = base.InsertEvent(clone);

                    }
                }
                else
                {
                    if (entry.Action == "Insert")
                    {
                        cloneChanges.Clear();
                        cloneChanges.Add(clone2.EntityFrameworkEvent.Entries[increment]);

                        foreach (var item in entry.ColumnValues)
                        {
                            cloneChanges[0].ColumnValues.Clear();
                            cloneChanges[0].ColumnValues.Add(item);
                            clone.EntityFrameworkEvent.Entries.Clear();
                            clone.EntityFrameworkEvent.Entries.Add(cloneChanges[0]);
                            clone.CustomFields = new Dictionary<string,object>();
                            clone.CustomFields.Add("TransactionId",newGuid);
                            lastId = base.InsertEvent(clone);
                        }
                    }
                    else
                    {
                        clone.EntityFrameworkEvent.Entries.Clear();
                        clone.EntityFrameworkEvent.Entries.Add(entry);
                        clone.CustomFields = new Dictionary<string,newGuid);
                        lastId = base.InsertEvent(clone);
                    }
                }
                increment += 1;
            }
        }
        else
        {
            return base.InsertEvent(auditEvent);
        }
        return lastId;
    }
}

这样的上下文

    public class ProjectContext : DbContext
{
    private static DbContextHelper _helper = new DbContextHelper();
    private readonly IAuditDbContext _auditContext;

    public ProjectContext()
        : base("ApplicationDatabase")
    {
        _auditContext = new DefaultAuditContext(this);
        _helper.SetConfig(_auditContext);
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Add(new DecimalPrecisionAttributeConvention());
    }

    public override int SaveChanges()
    {
        return _helper.SaveChanges(_auditContext,() => base.SaveChanges());
    }

    public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
    {
        return await _helper.SaveChangesAsync(_auditContext,() => base.SaveChangesAsync(cancellationToken));
    }

我创建了另一个通用数据库来记录另一个环境中的审计。 这在 3 个项目中运行良好。但在一个项目中,审计上下文已指定为本地上下文。你能找到原因吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...