要专业系统地学习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
}
View Code

相关文章: