存储DBContext其他EF表的日志
本文关键字:日志 EF DBContext 其他 存储 | 更新日期: 2023-09-27 18:04:24
我想将所有日志存储在一个DB表中(使用EF导入到我的代码中)。
我的代码是这样的:
public PMContext() :
base("MYEntities")
{
Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;
this.Database.Log = s => LogStore(s);
}
private void LogStore(string message)
{
TLog log = new TLog();
log.description = message;
log.insertDate = DateTime.Now;
Logs.Add(log);
SaveChanges();
}
public virtual DbSet<TLog> Logs { get; set; }
我不能使用SaveChanges()(得到错误"SqlConnection不支持并行事务"),如果我删除那一行没有存储在我的db表。
我该如何解决这个问题?
我认为这发生在SaveChanges
调用在你的应用程序的任何地方,因为从这个调用生成的SQL被记录,这触发了一个嵌套的SaveChanges
调用,试图启动自己的事务。
还有另一件事:LogStore
方法中的SaveChanges
调用将触发日志记录本身,所以如果它工作,你最终会开始一个无限循环。
如果你想通过一个上下文来做这件事,你最好使用一个单独的实例来记录日志。这个实例本身应该而不是做日志记录:
public PMContext() : this(true)
{ }
private PMContext(bool doLogging) : base("MYEntities")
{
Configuration.ProxyCreationEnabled = false;
Configuration.LazyLoadingEnabled = false;
if (doLogging)
{
this.Database.Log = s => LogStore(s);
}
}
private void LogStore(string message)
{
using(var db = new PMContext(false))
{
TLog log = new TLog();
log.description = message;
log.insertDate = DateTime.Now;
db.Logs.Add(log);
db.SaveChanges();
}
}
可能通过异步方法更好,因为这种同步执行会影响所有数据库交互。但是一个更好的选择是通过log4net,使用它的数据库记录器。