存储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表。

我该如何解决这个问题?

存储DBContext其他EF表的日志

我认为这发生在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,使用它的数据库记录器。