我想将所有日志存储在数据库表中(使用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不支持并行事务”),如果删除该行,我的数据库表中不会存储任何内容。
我该如何解决这个问题?
答案 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,使用其数据库记录器。