如何解决为什么 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 举报,一经查实,本站将立刻删除。