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創建和操作的詳細介紹,歡迎評論和留言

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM