I have an ASP.NET Core
application with 2 contexts for 2 databases (context_1 and context_2). I want to audit both contexts ,using Audit.Net
, to separate databases (context_audit_1 and context_audit_2)so I will have 4 databases in total.
The problem is eventhough I am using different contexts in configuration, it is still auditing to one database. In other words, context_1 and context_2 are auditing to context_audit_1.
Please see below the configuration I am using:
Context_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));
Context_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));
The problem is that you can't set more than one default data provider to save the events.
So the second time the
Audit.Core.Configuration.Setup().UseEntityFramework()
is called, it will override the default data provider previously configured.But you can use the override of
.UseDbContext()
that provides a way to set the Audit DbContext to use on a per-event basis.So maybe you could have something like this:
This is assuming your
AuditLog
entity is the same on both audit contexts.