要专业系统地学习EF前往《你必须掌握的Entity Framework 6.x与Core 2.0》这本书的作者(汪鹏,Jeffcky)的博客:https://www.cnblogs.com/CreateMyself/
EF里面当然也可以直接使用SQL语句了,比如有些复杂的查询用LINQ写不了的,还有存储过程那些东西。
EF为查询操作提供了两个方法:ctx.Database.SqlQuery<T>()、ctx.DbSet<T>.SqlQuery() (ctx表示上下文对象)
为Insert、Update、Delete 操作提供了两个方法:ExecuteSqlCommand()、ExecuteSqlCommandAsync()
我们来弄一弄这些方法,看看怎么回事
原始查询
ctx.Database.SqlQuery<T>() 和 ctx.Dbset<T>.SqlQuery() 两个方法的区别,最先要说的就是,ctx.Database.SqlQuery<T>()查询出的数据没有被上下文追踪,另一个方法查询出的实体则被追踪了
来看ctx.Database.SqlQuery<T>() 查询出实体的状态为Detached
using(EFDbContext ctx = new EFDbContext) { var res = ctx.Database.SqlQuery<Product>("select *from tb_products"); //var state = ctx.Entry(res).State; // 报错 实体 DbRawSqlQuery不是上下文模型的一部分 var first = res.FirstOrDefault(); var state = ctx.Entry(first).State; Console.WriteLine(state); // Deteched }