• Entity Framework框架 (一)


    1. Entity Framework的详细介绍:

    Entity Framework简称EF,与Asp.net关系与Ado.net关系。

    Entity Framework是ado.net中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。

    ORM:object relation mapping 是基于关系型数据库的数据储备,实现一个模拟的面向对象的数据访问接口,理想情况下,基于这样一个面向对象的接口,持久化一个oo对象应该不需要了解任何关系型数据库存储数据的实现细节。

    类似的轻量级的orm框架,dapper,patapoct

     1. lambda表达式:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        //定义一个委托
        public delegate int AddSum(int a,int b);
        class Program
        {
            static void Main(string[] args)
            {
                Program p = new Program();
               // AddSum addSum = new AddSum(p.Add);
               // AddSum addSum = delegate(int a, int b) { return a + b; };
                //AddSum addSum = (int a, int b) => { return a + b; };
                //简化之后的lambda表达式
                AddSum addSum = ( a,  b) => { return a + b; };
                int sum = addSum(5, 3);
                Console.WriteLine(sum);
                Console.ReadKey();
            }
    
            //public int Add(int a, int b)
            //{
            //    return a + b;
            //}
        }
        
    }
    lambda表达式

    一、第一种使用EF的方法:先有数据库再建立数据模型

     1. 在项目中右击新建,新建一个ADO.net实体数据模型,选择从数据库生成,这种是先有数据库再建立数据模型的方式。然后依次点击下一步便可,完成以后切记点击ctrl+s保存。不然是不会生成数据模型对应的类。

     2. 注意:对应的数据库表必须有主键,不然在使用时会报错。

     3. 生成之后的结构如下。 

     4.使用EF进行相关的增删改查代码如下:

     新建的web窗体页面,分别放四个button按钮便可。

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 using System.Web.UI;
      6 using System.Web.UI.WebControls;
      7 
      8 namespace WebApplication2
      9 {
     10     public partial class WebForm1 : System.Web.UI.Page
     11     {
     12         protected void Page_Load(object sender, EventArgs e)
     13         {
     14 
     15         }
     16         /// <summary>
     17         /// 插入数据
     18         /// </summary>
     19         /// <param name="sender"></param>
     20         /// <param name="e"></param>
     21         protected void Button1_Click(object sender, EventArgs e)
     22         {
     23             UserInfo UserInfo = new UserInfo();
     24             UserInfo.UserName = "张五呀";
     25             UserInfo.UserPass = "123qwe";
     26             UserInfo.RegTime = 2;
     27             UserInfo.Email = "wangjin";
     28             AdwResourcesEntities1 db = new AdwResourcesEntities1();
     29             //将数据添加到EF中,并且添加了标记,并且类似于生成了一条insert语句,但是这时候还没有执行该语句
     30             db.UserInfo.Add(UserInfo);
     31             //之后执行该代码时,才会执行insert语句,并且返回受影响行数
     32             db.SaveChanges();
     33             //返回刚刚插入的主键ID
     34             Response.Write(UserInfo.ID);
     35         }
     36         /// <summary>
     37         /// 查询数据
     38         /// </summary>
     39         /// <param name="sender"></param>
     40         /// <param name="e"></param>
     41         protected void Button2_Click(object sender, EventArgs e)
     42         {
     43             AdwResourcesEntities1 db = new AdwResourcesEntities1();
     44             var userinfolist = from u in db.UserInfo   //linq表达式
     45                                where u.ID == 65 
     46                                select u;
     47             //EF的延迟加载机制,只有数据在使用的时候才会去数据库中查询,不用的时候不查询。
     48             //只有执行下面的代码的时候才会去执行,这样可以提高整体的性能
     49             foreach (var userinfo in userinfolist)
     50             {
     51                 Response.Write(userinfo.ID);
     52             }
     53             //FirstOrDefault  查询第一条数据或者查询默认值
     54             //userinfolist.FirstOrDefault();
     55         }
     56         /// <summary>
     57         /// 删除数据
     58         /// </summary>
     59         /// <param name="sender"></param>
     60         /// <param name="e"></param>
     61         protected void Button3_Click(object sender, EventArgs e)
     62         {
     63             AdwResourcesEntities1 db = new AdwResourcesEntities1();
     64             var userinfolist = from u in db.UserInfo
     65                                where u.ID == 66
     66                                select u;
     67             //返回第一条数据,如果没有就放回null
     68             UserInfo userinfo = userinfolist.FirstOrDefault();
     69             if (userinfo != null)
     70             {
     71                 db.UserInfo.Remove(userinfo);
     72                 db.SaveChanges();
     73                 Response.Write("删除成功");
     74             }
     75             else
     76             {
     77                 Response.Write("数据有误");
     78             }
     79             
     80             ////执行删除的第二种方法
     81             //UserInfo userInfo = new UserInfo() {ID=344};
     82             db.Entry<UserInfo>(userinfo).State = System.Data.Entity.EntityState.Deleted;
     83             //db.SaveChanges();
     84         }
     85 
     86         /// <summary>
     87         /// 修改数据
     88         /// </summary>
     89         /// <param name="sender"></param>
     90         /// <param name="e"></param>
     91         protected void Button4_Click(object sender, EventArgs e)
     92         {
     93             //构建一个
     94             AdwResourcesEntities1 db = new AdwResourcesEntities1();
     95             var userinfolist = from u in db.UserInfo
     96                                where u.ID == 65
     97                                select u;
     98             UserInfo userinfo = userinfolist.FirstOrDefault();
     99             userinfo.UserPass = "qweqwe";
    100             db.Entry<UserInfo>(userinfo).State = System.Data.Entity.EntityState.Modified;
    101             db.SaveChanges();
    102             Response.Write("修改成功");
    103         }
    104     }
    105 }

     二、第二种ModelFirst模式使用EF的方法,先建立数据模型,再生成数据库对应的表。

     1. 先在数据库中新建一个数据库。

     2.  在项目中右击新建项目,选择数据源,点击空模型。

     3. 在生成的空白界面中,右击新增实体,新增之后再新增标量属性,如果是多表,并且有关联的表,右击新增关联,再右击根据数据模型生成数据库。

     4. 点击如下文件,需要点击执行才会生成数据库。

     5. 使用第二种进行增删改查的相关代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 using System.Web.UI;
      6 using System.Web.UI.WebControls;
      7 
      8 namespace WebApplication1
      9 {
     10     public partial class WebForm2 : System.Web.UI.Page
     11     {
     12         protected void Page_Load(object sender, EventArgs e)
     13         {
     14 
     15         }
     16         /// <summary>
     17         /// 插入数据
     18         /// </summary>
     19         /// <param name="sender"></param>
     20         /// <param name="e"></param>
     21         protected void Button1_Click(object sender, EventArgs e)
     22         {
     23             Model2Container db = new Model2Container();
     24             Customer customer = new Customer() {CustomerName="zhangsan",CustomerPwd="123", SubTime=DateTime.Now };
     25             // Customer = customer导航属性,代表下面的数据属于上面的值
     26             OrderInfo orderInfo1 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "10001", CreateDateTime = DateTime.Now,Customer=customer };
     27             OrderInfo orderInfo2 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "10002", CreateDateTime = DateTime.Now, Customer = customer };
     28             db.Customer.Add(customer);
     29             db.OrderInfo.Add(orderInfo1);
     30             db.OrderInfo.Add(orderInfo2);
     31             db.SaveChanges();//默认的已经开启了事务。 工作单元模式。(UnitOfwork)
     32         }
     33         /// <summary>
     34         /// 查询数据
     35         /// </summary>
     36         /// <param name="sender"></param>
     37         /// <param name="e"></param>
     38         protected void Button2_Click(object sender, EventArgs e)
     39         {
     40             Model2Container db = new Model2Container();
     41             var customerList = from c in db.Customer
     42                                select c;
     43             foreach (var customer in customerList)
     44             {
     45                 Response.Write(customer.CustomerName+":");
     46 
     47 
     48                 foreach (var orderInfo in customer.OrderInfo)//延迟加载。
     49                 {
     50                     Response.Write(orderInfo.OrderNum);
     51                 }
     52             }
     53         }
     54         /// <summary>
     55         /// 根据名字id查询所有的订单
     56         /// </summary>
     57         /// <param name="sender"></param>
     58         /// <param name="e"></param>
     59         protected void Button3_Click(object sender, EventArgs e)
     60         {
     61             Model2Container db = new Model2Container();
     62             //var customerInfoList = from c in db.Customer
     63             //                   where c.ID == 1
     64             //                   select c;
     65             //var customerInfo = customerInfoList.FirstOrDefault();
     66             //foreach (var orderInfo in customerInfo.OrderInfo)
     67             //{
     68             //    Response.Write(orderInfo.OrderNum);
     69             //}
     70 
     71             var orderInfoList = from o in db.OrderInfo
     72                                where o.CustomerID == 1
     73                                select o;
     74             foreach (var orderInfo in orderInfoList)
     75             {
     76                 Response.Write(orderInfo.OrderNum);
     77             }
     78                            
     79         }
     80         /// <summary>
     81         /// 输出10001对应的客户ID
     82         /// </summary>
     83         /// <param name="sender"></param>
     84         /// <param name="e"></param>
     85         protected void Button4_Click(object sender, EventArgs e)
     86         {
     87              Model2Container db = new Model2Container();
     88              var orderInfoList = from o in db.OrderInfo
     89                                  where o.OrderNum == "10001"
     90                                  select o;
     91              var orderInfo = orderInfoList.FirstOrDefault();
     92              Customer customer = orderInfo.Customer;
     93              Response.Write(customer.CustomerName);
     94         }
     95         /// <summary>
     96         /// 根据人员ID删除对应数据
     97         /// </summary>
     98         /// <param name="sender"></param>
     99         /// <param name="e"></param>
    100         protected void Button5_Click(object sender, EventArgs e)
    101         {
    102             Model2Container db = new Model2Container();
    103             //var customer = (from c in db.Customer
    104             //                where c.ID == 1
    105             //                select c).FirstOrDefault();
    106             //var orderInfoList = customer.OrderInfo;
    107             //while (orderInfoList.Count > 0)
    108             //{
    109             //    var orderInfo = orderInfoList.FirstOrDefault();
    110             //    db.Entry<OrderInfo>(orderInfo).State = System.Data.EntityState.Deleted;
    111             //}
    112             //db.SaveChanges();
    113 
    114             var orderList = from o in db.OrderInfo
    115                             where o.CustomerID == 2
    116                             select o;
    117 
    118         }
    119 
    120     }
    121 }

     三、第三种codeFirst模式,该模式是指不建立数据模型,并且不建立建立数据库的情况下,通过代码的形式去新建一个数据库。

       1. :创建实体类,并且给实体加上特性标签,并且标注一下实体类之间的关系。

         1.1创建classInfo(班级)实体类

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel.DataAnnotations;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Threading.Tasks;
     7 
     8 namespace CodeFirstDemo
     9 {
    10    public class ClassInfo
    11     {
    12        [Key]  //特性标签
    13        public int Id { get; set; }
    14        [StringLength(32)]   //指定是字符串类型
    15        [Required]            //必填项
    16        public string ClassName { get; set; }
    17        [Required]
    18        public DateTime CreateTime { get; set; }
    19        //表示1对多,指一个班级对应多个学生
    20        public virtual ICollection<StudentInfo> StudentInfo { get; set; }
    21     }
    22 }

      1.2 :创建学生实体类

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel.DataAnnotations;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Threading.Tasks;
     7 
     8 namespace CodeFirstDemo
     9 {
    10    public class StudentInfo
    11     {
    12        [Key]
    13        public int Id { get; set; }
    14        [StringLength(32)]
    15        [Required]
    16        public string StuName { get; set; }
    17         [Required]
    18        public DateTime SubTime { get; set; }
    19        public virtual ClassInfo ClassInfo { get; set; }  //表明外键关系,多对1
    20     }
    21 }

    1.3. 引用Entity

      方法1,点击引用,system.data.Entity

      方法2. 新建一个数据模型,之后删掉,此时已经自动引用了entity

    1.4 :创建codefirstdbcontext:dbcontext文件

      

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Data.Entity;
     4 using System.Data.Entity.ModelConfiguration.Conventions;
     5 using System.Linq;
     6 using System.Text;
     7 using System.Threading.Tasks;
     8 
     9 namespace CodeFirstDemo
    10 {
    11    public class CodeFirstDbContext:DbContext
    12     {
    13        public CodeFirstDbContext()
    14            : base("name=connStr")  //对应连接数据库字符串的名字
    15        {
    16 
    17        }
    18        protected override void OnModelCreating(DbModelBuilder modelBuilder)
    19        {
    20            //此代码的功能是移除复数的约定  就是指生成的表名后面不加S
    21            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    22        }
    23         //对应的表
    24        public DbSet<ClassInfo> ClassInfo { get; set; }
    25        public DbSet<StudentInfo> StudentInfo { get; set; }
    26     }
    27 }

    1.5 :在配置文件构建数据库链接字符串。

    1  <configSections>
    2     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    3   </configSections>

    1.6:查询部分数据以及实例创建代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace WebApplication1
    {
        public partial class WebForm3 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
            }
            /// <summary>
            /// 只查询其中几列数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Button1_Click(object sender, EventArgs e)
            {
                //使用HttpContext,只要持续调用,就一直都不会中断 
                EFFristModelEntities db = null;
                if (HttpContext.Current.Items["db"] == null)
                {
                    db = new EFFristModelEntities();
                    HttpContext.Current.Items["db"] = db;
                }
                else
                {
                    db = HttpContext.Current.Items["db"] as EFFristModelEntities;
                }
    
               var userInfoList = from u in db.UserInfo
                                   where u.ID == 343
                                   select  new{UName=u.UserName,UPwd=u.UserPass};    //新建一个匿名类查询
                foreach (var userInfo in userInfoList)
                {
                    Response.Write(userInfo.UName+":"+userInfo.UPwd);
                }
    
            }
            /// <summary>
            /// 匿名函数来查询
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Button2_Click(object sender, EventArgs e)
            {
              //  Func<UserInfo, bool> whereLambda = u => { return u.ID == 343; };
              
                EFFristModelEntities db = new EFFristModelEntities();
                //var userInfoList = db.UserInfo.Where<UserInfo>(u=>u.ID==3);
               
                //select * from UserInfo where id=343
                //升序排序
                //var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderBy<UserInfo, int>(u => u.ID);
                //降序排序
             //var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.ID);
    
                int pageIndex = 2;
                int pageSize = 2;
                var userInfoList = (from u in db.UserInfo
                                    where u.ID > 0
                                    orderby u.RegTime ascending, u.ID descending
                                    select u).Skip<UserInfo>((pageIndex - 1) * pageSize).Take<UserInfo>(pageSize);
             
          //   var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.UserPass).ThenByDescending<UserInfo, int>(u => u.ID);//Skip:表示跳过多少条记录, Take取多少条记录
    
          
                foreach (var userInfo in userInfoList)
                {
                 
                        Response.Write(userInfo.UserName + "<br/>");
                  
                }
            }
    
            protected void Button3_Click(object sender, EventArgs e)
            {
                string str ="ttttt";
              Response.Write (str.MyStr());
            }
    
            protected void Button4_Click(object sender, EventArgs e)
            {
                EFFristModelEntities db = new EFFristModelEntities();
              
                var userInfoList = db.UserInfo.Where<UserInfo>(u => u.ID >0);
            
                int i = 0;
                int count = userInfoList.Count();
                Response.Write(count);
    
            }
        }
    }
    查询部分数据以及实例创建代码

    以上就是EF创建和操作的详细介绍,欢迎评论和留言

  • 相关阅读:
    HTTP协议
    浏览器兼容性问题
    面试笔试重点总结:操作系统、计算机网络、设计模式
    笔试、面试重点总结:算法基础、数据结构
    笔试、面试重点总结:WIN32、MFC与Linux
    《Java程序员面试笔试宝典》终于在万众期待中出版啦~
    《Java程序员面试笔试宝典》之Static关键字有哪些作用
    《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么
    《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法
    《Java程序员面试笔试宝典》之Java变量命名有哪些规则
  • 原文地址:https://www.cnblogs.com/wangjinya/p/10586840.html
Copyright © 2020-2023  润新知