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

如何解决为什么 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?