问题描述
我必须将多个项目的审计数据记录到一个公共数据库中。我是这样做的。
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 (将#修改为@)