要专业系统地学习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也提供了其他的接口,供我们更可控地记录日志。