由于 EF 位不断变化,我对上述所有答案都感到困惑,因此代码无法编译。从今天(2016 年 2 月 19 日)开始,使用 EF7.0.0-rc1-final(Prerelease)和 SQLite,这对我有用:
来自 EF7 文档:
using System;
using System.IO;
using Microsoft.Extensions.Logging;
namespace EFLogging
{
public class EFLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName)
{
return new EFLogger();
}
public void Dispose()
{
// N/A
}
private class EFLogger : ILogger
{
public IDisposable BeginScopeImpl(object state)
{
return null;
}
public bool IsEnabled(LogLevel logLevel)
{
return true;
}
public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
{
File.AppendAllText(@".\EF.LOG", formatter(state, exception));
Console.WriteLine(formatter(state, exception));
}
}
}
}
使用上面的一些想法和 EF7 文档:
using System;
using Microsoft.Data.Entity;
using Microsoft.Data.Entity.Infrastructure;
using Microsoft.Extensions.DependencyInjection; // Add this to EF7 docs code
using Microsoft.Extensions.Logging;
namespace DataAccessLayer
{
public static class DbContextExtensions
{
public static void LogToConsole(this DbContext context)
{
var serviceProvider = context.GetInfrastructure<IServiceProvider>();
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
loggerFactory.AddProvider(new EFLoggerProvider(logLevel));
}
}
}
编辑:@jnm2 指出如果您添加“使用 Microsoft.Extensions.DependencyInjection”,EF7 文档是正确的。谢谢!
最后,在我的 App.OnStartup 方法中:
using (var db = new MyDbContext())
{
db.LogToConsole();
}
此代码将创建一个日志文件并将日志信息输出到 Visual Studio 输出窗口。我希望这会有所帮助——我敢肯定,几周后,这些位会再次发生变化。