将DBContext存储在其他EF表中

时间:2015-07-23 17:25:08

标签: c# entity-framework ado.net asp.net-mvc-5

我想将所有日志存储在数据库表中(使用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不支持并行事务”),如果删除该行,我的数据库表中不会存储任何内容。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为这发生在您的应用中的SaveChanges调用期间,因为此调用生成的SQL会被记录,从而触发尝试启动自己的事务的嵌套SaveChanges调用。

另外还有一件事:SaveChanges方法中的LogStore调用会自动触发记录,因此如果有效,您最终会启动无限循环。

如果要通过上下文执行此操作,最好仅使用单独的实例进行日志记录。此实例本身应该进行日志记录:

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,使用其数据库记录器。