EF6学习笔记二十:简单日志记录

要专业系统地学习EF推荐《你必须掌握的Entity Framework 6.x与Core 2.0》。这本书作者(汪鹏,Jeffcky)的博客:https://www.cnblogs.com/CreateMyself/

 我们来看看简单日志记录。

用EF,毕竟最终还是对数据库的操作,那么怎么清楚地知道EF执行的SQL语句是什么样的?

EF提供了日志记录功能

针对IQueryable接口ToString()打印

var res = ctx.Commodities.OrderBy(x => x.Price).Skip(1).Take(1);
Console.WriteLine(res);

生成的SQL如下,此时EF并没有执行这条SQL语句

复制代码
SELECT
    [Extent1].[Id] AS [Id],
    [Extent1].[Name] AS [Name],
    [Extent1].[Unit] AS [Unit],
    [Extent1].[Price] AS [Price],
    [Extent1].[FK_StoreId] AS [FK_StoreId],
    [Extent1].[AddTime] AS [AddTime]
    FROM [dbo].[tb_Commodities] AS [Extent1]
    ORDER BY row_number() OVER (ORDER BY [Extent1].[Price] ASC)
    OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
复制代码

查询内存中的集合都是实现的 IEnumerable 接口,那么直接就是查询出数据

查询远程数据实现的是IQueryable接口,所以我们可以直接打印它,就是SQL语句

但是你不能有返回类型为IEnumberable的方法,比如ToList(),那么它就把数据拿到内存中来了。

ctx.Database.Log

用这个也是很爽的,前面我学EF,通过EF提供的这个,对我帮助还是很大的。

这个Log是个Action<string>类型的,如果是控制台,可以顺手将Console.WriteLine赋值给它

也可以自定义方法

static void MyLog(string name, string msg)
        {
            Console.WriteLine($"{name}的跟踪:${msg}");
        }
 ctx.Database.Log = msg => MyLog("四海", msg);
 var res = ctx.Commodities.ToList();

 

再来写入文件看看

 string path = AppDomain.CurrentDomain.BaseDirectory + "../../DBLog/DBLog.txt";
 StreamWriter sw = new StreamWriter(path) { AutoFlush = true };
 ctx.Database.Log = msg => sw.Write(msg);
 var res = ctx.Commodities.ToList();
 sw.Close();

这是比较简单的日志打印,Database.Log提供的比较简单,我们自己的操作并不多。

EF也提供了其他的接口,供我们更可控地记录日志。

猜你喜欢

转载自www.cnblogs.com/anyihen/p/12819545.html
EF6