Fork me on GitHub

Entity Framework(四)--EF原理和状态管理

一、原理:

       如何查看真正执行的SQL是怎样的? 

             DbContext有一个Database属性,Database属性有一个Log属性,是Action委托类型其中的参数就是sql语句,每次EF执行sql语句的时候都会执行Log,因此就知道执行了什么sql;

             EF的查询是“延迟执行”的,只有遍历结果集的时候才执行select查询,Tolist()内部也是遍历结果集形成的List;

        static void Main(string[] args)
        {
            using (TestDbContext ctx = new TestDbContext())
            {
                ctx.Database.Log = sql =>
                {
                    Console.WriteLine(sql);
                };
                var ps= ctx.Persons.Where(p => p.Id <4);

                Console.WriteLine("开始执行了");


                 foreach (var p in ps)
                 {
                     Console.WriteLine(p.ToString());
                 }
                 
                Console.ReadKey();
            }
        }
                long[] ids = { 2, 5, 8 };
                var result = ctx.Persons.Where(p => ids.Contains(p.Id));
result.toList();
                //二次过滤,在sql中自动拼接。
                long[] ids = { 2, 5, 8 };
                var result = ctx.Persons.Where(p => ids.Contains(p.Id));
                result = result.Where(p => p.Name.Length > 5);

              EF多次指定where来实现动态的复合检索; select返回值必须写成IQueryable<Person> 

              EF是夸数据库的,如果迁移到Mysql数据库上,就会编译成Mysql语法。要配置对应数据库的EntityFrameworkProvider

              每次执行_MigrationHistory 是DBMigration用的,也就是EF帮我们建数据库,可以禁用:

                Database.SetInitializer<****DbContext>(null)

 

二、执行原始Sql语句:

         在一些特殊的场合,需要执行原生的SQL。

         执行非查询语句:调用DbContext 的Database 属性的ExecutesqlCommand 方法,可以通过占位符的方式传递参数:

            using (TestDbContext ctx = new TestDbContext())
            {

                string name = "Tony";
                ctx.Database.ExecuteSqlCommand("insert into T_Persons(Name,CreateDateTime) values({0},GetDate())", name);

                Console.ReadKey();
            }

        执行查询语句: 

        static void Main(string[] args)
        {
            using (TestDbContext ctx = new TestDbContext())
            {

               var result=  ctx.Database.SqlQuery<GroupCount>(" select Age,COUNT(*) as GroupCounts from T_Persons group by Age ");
                foreach (var item in result)
                {
                    Console.WriteLine(item.Age+"="+item.GroupCounts);
                }

                Console.ReadKey();
            }
        }
   public class GroupCount
    {
        public int Age { get; set; }
        public int GroupCounts { get; set; }
    }

 

 

三、EF对象的状态

        EF中的对象有五个状态:  Derached(游离态,脱离态),Unchange(未改变),Added(新增),Deleted(删除),Modified(被修改)

 

 

posted @ 2018-08-01 10:49  精进的小陈  阅读(1999)  评论(0编辑  收藏  举报