У меня есть приложение ASP.NET Core с 2 контекстами для 2 баз данных (context_1 и context_2). Я хочу провести аудит обоих контекстов, используя Audit.Net, чтобы разделить базы данных (context_audit_1 и context_audit_2), так что всего у меня будет 4 базы данных.
Проблема в том, что хотя я использую разные контексты в конфигурации, он по-прежнему выполняет аудит в одной базе данных. Другими словами, context_1 и context_2 проверяют на context_audit_1.
См. Ниже конфигурацию, которую я использую:
Контекст_1

                var auditDbContextOptions = new DbContextOptionsBuilder<AuditDbContext1>()
         .UseSqlServer(_connectiongStrings.PortalConnection1)
         .Options;

            //Audit Configuration
            Audit.Core.Configuration.Setup()
                .UseEntityFramework(_ => _
                    .UseDbContext<AuditDbContext1>(auditDbContextOptions)
                    .AuditTypeMapper(t => typeof(AuditLog))
                    .AuditEntityAction<AuditLog>((ev, entry, entity) =>
                    {
                        entity.AuditData = entry.ToJson();
                        entity.Action = entry.Action;
                        entity.TableName = entry.EntityType.Name;
                        entity.AuditDate = DateTime.Now;
                        entity.UserId = _auditHelperService.GetUserId();
                        entity.TablePK = entry.PrimaryKey.First().Value.ToString();
                    })
                .IgnoreMatchedProperties(true));

Контекст_2

            var auditDbContextOptions = new DbContextOptionsBuilder<AuditDbContext2>()
         .UseSqlServer( _connectiongStrings.PortalConnection2)
         .Options;


            //Audit Configuration
            Audit.Core.Configuration.Setup()
                .UseEntityFramework(_ => _
                    .UseDbContext<AuditDbContext2>(auditDbContextOptions)
                    .AuditTypeMapper(t => typeof(AuditLog))
                    .AuditEntityAction<AuditLog>((ev, entry, entity) =>
                    {
                        entity.AuditData = entry.ToJson();
                        entity.TableName = entry.EntityType.Name;
                        entity.Action = entry.Action;
                        entity.AuditDate = DateTime.Now;
                        entity.UserId = _auditHelperService.GetUserId();
                        entity.TablePK = entry.PrimaryKey.First().Value.ToString();
                    })
                    // the use of .IgnoreMatchedProperties(true) to avoid the library trying to set properties automatically by matching names between the audited entities and the type AuditLog
                    .IgnoreMatchedProperties(true));
1
Sarahbe 9 Дек 2020 в 09:34

1 ответ

Лучший ответ

Проблема в том, что вы не можете установить более одного поставщика данных по умолчанию для сохранения событий.

Таким образом, при втором вызове Audit.Core.Configuration.Setup().UseEntityFramework() он переопределит ранее настроенный поставщик данных по умолчанию.

Но вы можете использовать переопределение .UseDbContext(), которое предоставляет способ настроить Audit DbContext для использования для каждого события.

Так что, возможно, у вас могло бы получиться что-то вроде этого:

Audit.Core.Configuration.Setup()
    .UseEntityFramework(_ => _
        .UseDbContext(ev => ev.GetEntityFrameworkEvent().Database == "DB1" 
            ? new AuditDbContext1(auditDbContextOptions1)
            : new AuditDbContext2(auditDbContextOptions2))
        .AuditTypeMapper(t => typeof(AuditLog))
        .AuditEntityAction<AuditLog>((ev, entry, entity) =>
        {
            entity.AuditData = entry.ToJson();
            entity.Action = entry.Action;
            entity.TableName = entry.EntityType.Name;
            entity.AuditDate = DateTime.Now;
            entity.UserId = _auditHelperService.GetUserId();
            entity.TablePK = entry.PrimaryKey.First().Value.ToString();
        })
    .IgnoreMatchedProperties(true));

Предполагается, что ваша сущность AuditLog одинакова в обоих контекстах аудита.

1
thepirat000 10 Дек 2020 в 22:40