EF ModeFirst模式简介

136 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

在VS里面新建控制台项目,项目目录如下:

在建完控制台应用程序后在项目上添加【ADO.Net实体数据模型】,然后选择空的EF设计器模型。在设计器里面添加两个实体,实体关联成1对多的关系,然后再vs里面需要手动添加代码生成项,在设计器里面右键然后添加代码生成项,命名与实体数据模型相同,添加后会自动组织到DataModel.edmx下面。然后右键生成数据库,之后新建数据库生成脚本(DataModel.edmx.sql)执行脚本后数据库和模型就完成了。

使用EF进行简单的增删改查,首先创建数据上下文,这个数据上下文名字是EF自动生成需要到DataModel.Context.cs里面去查看。

DataModelContainer dbContext = new DataModelContainer();

1、新增

            UserInfo userInfo = new UserInfo();
            userInfo.UName = "刘备";

            dbContext.UserInfo.Add(userInfo);

            OrderInfo order1 = new OrderInfo();
            order1.Content = "第一个订单";
            dbContext.OrderInfo.Add(order1);

            OrderInfo order2 = new OrderInfo();
            order2.Content = "第二个订单";
            dbContext.OrderInfo.Add(order2);

            //关联三个实体(3种方式关联导航属性)
            //1、通过用户添加订单实体到自己的导航实体
            userInfo.OrderInfo.Add(order1);

            //2、通过订单指定用户实体
            order2.UserInfo = userInfo;

            //3、外键关联(如果UserInfo ID已经存在 不然只能用上面两种)
            //order2.UserInfoID = userInfo.ID;

2、修改

            UserInfo userInfoModify = new UserInfo();
            userInfoModify.ID = 1;
            userInfoModify.UName = "孙权";

            dbContext.Entry(userInfoModify).State = System.Data.Entity.EntityState.Modified;
            //修改单个属性
            //dbContext.Entry(userInfoModify).Property(u => u.UName).IsModified = true;
            

3、删除

            OrderInfo orderInfoDel = new OrderInfo();
            orderInfoDel.ID = 2;
            dbContext.Entry(orderInfoDel).State = System.Data.Entity.EntityState.Deleted;

4、查询

            IQueryable<UserInfo> temp = from u in dbContext.UserInfo
                                        where u.ID > 0
                                        select u;
            //1、linq表达式转成Expression类型
            //2、给Type ElementType赋值
            //3、给Iqueryable Provider赋值,ef provider(根据dbcontext 数据上下文)
            foreach (var user in temp)
            {
                Console.WriteLine("ID:" + user.ID + "      UName:" + user.UName);
            }

Linq 可以 to (sql,ef,object.....)其原理就是IQueryable接口。接口中有三个属性如图:

其中Expression是表达式目录树实例描述表达式(实际是一颗表达式树),例如lambad表达式:System.Linq.Expressions.Expression<Func<int, bool>> expression = a => a> 0; 也可以转换成Expression实例,同样Linq表达式也转换成Expression。 而Type就是表示表达式类型,列如表达式的类型是linq 还是Lambad等。 Provider则是根据当前初始化的Provider(此处是EF Provider)进行解析执行表达式。

5、延迟加载

            IQueryable<UserInfo> temp1 = from u in dbContext.UserInfo
                                         where u.ID > 0
                                         select u;

            //第一种延迟加载是temp1在没用使用的时候 数据还没有查询出来。在用作其他linq查询时是当做子查询语句。
            IQueryable<UserInfo> temp2 = from u in temp1
                                         where u.UName != string.Empty
                                         select u;

            foreach (var user in temp2)
            {
                Console.WriteLine("ID:" + user.ID + "      UName:" + user.UName);
            }

            //第二种延迟加载 在模型对象里面有导航属性时候,当导航属性没有手动加载数据时我们使用导航属性EF会自动根据当前模型对象信息查询导航属性数据
            foreach (var user in temp2)
            {
                foreach (var order in user.OrderInfo)
                {
                    Console.WriteLine("ID:" + order.ID + "      Content:" + order.Content);
                }
            }

最后以上操作需要调用 dbContext.SaveChanges();  把上面的实体变化封装成sql 执行到数据库里面。