如何使用EF?


方法1:

  新建好項目之后 → 右擊類庫 → 新建項 → ADO.NET實體數據模型(在Visual C#項中) → 從數據庫生成 → 選擇你要映射的數據庫的數據源(將 『是,在連接字符串中包含敏感數據』勾上) → 選中要映射的表、視圖、存儲過程。

下面是使用!

//保證一次請求共用一個上下文實例

 

var dbContext = DbContextHelper.getCurrentDbContext();

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Web;

namespace myWeb
{
    public class DbContextHelper
    {

        //保證一次請求共用一個上下文實例
        public static MyDbContext getCurrentDbContext()
        {
            #region HttpContext方式:內部封裝了CallContext,所以HttpContext方式和CallContext方式差別不大
            //    //HttpCntext:一次請求,HttpContext已經保證只有一個實例
            //    MyDbContext dbContext = HttpContext.Current.Items["MyDbContext"] as MyDbContext;
            //    if (dbContext == null)
            //    { //當前Http上下文不存在當前對象
            //        dbContext = new MyDbContext();
            //        HttpContext.Current.Items.Add("MyDbContext", dbContext);
            //    }
            #endregion

            #region CallContext方式
            MyDbContext dbContext = CallContext.GetData("DbContext") as MyDbContext;
            if (dbContext == null)
            {
                dbContext = new MyDbContext();
                CallContext.SetData("DbContext", dbContext);
            }

            #endregion

            return dbContext;
        }



    }
    /// <summary>
    /// 這里的MyDbCotext類只是打一個比方,實際在用的時候需要更改成項目所需要用的實體類
    /// </summary>
    public class MyDbContext
    {

    }
}
DbContextHelper.cs

 

//1、聲明一個EF的上下文
            MyTestEntities1 dbcontext = new MyTestEntities1();
//dbcontext.Database.Connection.ConnectionString = "";//重新設置數據庫連接字符串(對於非常重要數據庫,如銀行的賬號密碼等,需要對數據庫字符串進行密鑰加密的,可以在這里解密后重新賦值)
 //2、聲明一個User實體
            //USERS user = new USERS();
            //user.NAME = "vichin";
            //user.SEX = "男";
            //user.DATE = "19921126";
            //user.ID = 4;
            //user.NUMBER = 4;

            //3、告訴EF,咱們對實體的做一個插入操作
            //dbcontext.USERS.Add(user);   

            //3、告訴EF,咱們對實體的做一個刪除操作
            //dbcontext.USERS.Remove(user);
做一個 添加/刪除 操作

 

            //2、聲明一個實體
            USERS user = new USERS();            
            user.SEX = "";
            user.NAME = "vichin";
            user.DATE = "19861112";
            user.ID = 4;   
            
            //3、告訴上下文咱們要對此實體進行更新操作
            
             #region 對一整行數據進行更行
            dbcontext.Entry<USERS>(user).State = System.Data.Entity.EntityState.Modified;//要做刪除的話,只需要將modified改寫成Deleted
    
             #endregion
 
            #region 對一行數據中,某個字段進行更新
            dbcontext.USERS.Attach(user);//將新的user對象附加到上下文中來,進行管理
            dbcontext.Entry<USERS>(user).Property<string>(u => u.NAME).IsModified = true;  // EF5.0之后的寫法(VS2012開始使用)
            dbcontext.Entry<USERS>(user).Property("NAME").IsModified = true;//EF4.0的寫法(VS2010中的寫法) 
           #endregion  
做一個更改操作

  

//4、告訴上下文把實體的變化保存到數據庫(執行SQL腳本)
            dbcontext.SaveChanges();

 

       //使用查詢語法
            var temp = from u in dbcontext.USERS
                       where u.ID == 4
                       select u;
  
        //查詢部分列
        var data = from u in dbcontext.USERS
        select new { u.ID, u.NAME, u.SEX, u.NUMBER };


        //使用方法語法
        var temp2 = dbcontext.USERS.Where(u => u.ID == 4);       

        //查詢部分列
        var data1 = dbcontext.USERS.Where(u => u.ID == 4).Select(u=>u.ID);
        var data2 = dbcontext.USERS.Where(u => u.ID == 4).Select(u => new { u.ID,u.NAME,u.NUMBER});

    

         //IQueryable<USERS> temp1 = from u in dbcontext.USERS
                                  // where u.ID == 4
                                  // select u;

     //上面是在數據庫中做了篩選之后才放到內存中的

     //linq to object 將數據庫的數據全都放到內存中
      //var temp1 = from u in dbcontext.USERS.ToList()
             //where u.ID == 4 
             //select u;

            #region 分頁

            var pageData = dbcontext.USERS.Where(u => u.ID > 0).OrderBy<USERS, int>(u => u.ID);
            //int <==> ID  根據ID來排序,所以在OrderBy后面的泛型約束中TKey 使用int(因為ID是int類型的)
            var pageData1 = dbcontext.USERS.Where(u => u.ID > 0).OrderBy<USERS, string>(u => u.NAME);

            //在實際使用中,可以將orderBy后面的泛型約束給省略掉:
            var pageData2 = dbcontext.USERS
                .Where(u => u.ID > .0)
                .OrderBy(u => u.NAME)
                // 每頁5條,要取第三頁的數據。從第10條數據開始取5條數據
                .Skip(5*(3-1))//越過多少條數據呢? 越過前2頁的數據
                .Take(5);//取5條

            //使用查詢語法做分頁 
            var pageData3 = (from u in dbcontext.USERS
                             where u.ID > 0
                             orderby u.ID descending
                             select u).Skip(10).Take(5);
            //還是要用到skip take
            
            #endregion
做一個查詢

 
 在對數據庫進行刪除、更新操作時,一定要將所有的非空字段(實體的屬性)賦值,即使在更新的時候用不到那個字段,也得賦值。


方法二:

1、在VS中創建數據庫

  點擊 view(視圖)→sql server對象資源管理器(或者叫數據庫資源管理器database Explorer)→在SQL 對象資源管理器中右擊Sql Server→添加Sql server.之后再創建的Sql server對象中添加database 和 表(此處以Products為例),並在表中添加一些測試數據。

2、創建數據模型

  數據模型類名為Product

3、添加EF 並創建EF上下文

  install-package entity framework -version5.0

  namespace SportsStore.Models.Repository{

    public class EFDbContext:DbContext{

      public DbSet<Product> Products{get;set;}// Products與表名Products相同,表中每一行數據都用Product來表示

    }  

  }

  在web.config文件中ConfigSections節點后添加數據庫連接字符串

  <connectionStrings>
    <add connectionString="Data Source=RY4H4GAGMN6Y5LN;Initial Catalog=SportsStore;Integrated Security=True" name="EFDbContext" providerName="System.Data.SqlClient"/>
  </connectionStrings>
添加的節點

 

4、在倉儲層中創建一個存儲庫類,它將對前面創建的EFDbContext類執行操作,並作為應用程序業務邏輯與數據庫之間的“橋梁”。

  namespace SportsStore.Models.Repository{

    public class Repository{

      EFDbContext context=new EFDbContext ();

      public IEnumber<Product> Products{get{return context.Products;}}

    }

  }

5、使用(只要創建倉儲層對象就可以使用了)

  Repository repo=new Repository();

  repo.Products


 

當數據庫內的表或者字段發生變化時,就會報以下錯誤:

 

The model backing the 'EFDbContext' context has changed since the database was created. Consider ....

最直接的方式是刪除VS中的數據庫,並且重新添加。

 

 

 

linqpad官網: http://www.linqpad.net/  

下面是常見錯誤(部分)


 

報錯: Unable to update the EntitySet 'USERS' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

報錯:從 ObjectStateEntry 中檢索值時出錯。有關詳細信息,請參閱內部異常。

 

原因:報這個錯的原因是表中沒有主鍵!


————————————————————————————————————————————
代碼:dbcontext.Entry<USERS>(user).State = System.Data.EntityState.Modified;

報錯:無法將類型"System.Data.EntityState"隱式轉換為"System.Data.Entity.EntityState"

原因:這行代碼是EF5.0中的寫法,如果用的是6.0則需要寫成
dbcontext.Entry<USERS>(user).State = System.Data.Entity.EntityState.Modified;


————————————————————————————————————————————
報錯:對一個或多個實體的驗證失敗。有關詳細信息,請參閱“EntityValidationErrors”屬性。

原因:實體的非空屬性沒有全部都被賦值,或者是數據的長度超過了定義的類型 (NVARCHAR 100)


————————————————————————————————————————————
報錯:存儲區更新、插入或刪除語句影響到了意外的行數(0)。實體在加載后可能被修改或刪除。刷新 ObjectStateManager項

原因:要操作的數據在數據庫並不存在。(例如:要刪除一個ID為9999的數據,可是當前數據庫中並沒有ID為9999的數據)

 

—————————————————————————————————————————————————————————————————————————EF優缺點

  優點:

  1、極大提高開發效率,與VS的開發工具集成度高,開發中沒,代碼幾乎都是強類型的,寫代碼效率高,自動化程度高,命令式編程。

  2、EF提供的模型設計器非常強大,不僅僅帶來了設計數據庫的革命,也帶來了自動化生成模型代碼的功能,極大提高了開發與架構設計的效率。

  3、僅僅通過改變配置,就可以做到誇數據庫的能力。

       缺點:

  性能差(在生成SQL腳本階段),在復雜查詢的時候,生成的SQL腳本效率不高。

    1、根據XML映射關系及實體的狀態生成相應的腳本(相對於SQL語句在數據庫中執行的速度來說是慢的,所以在做互聯網項目的時候不推薦使用EF,而在做企業級開發的時候,可以使用。)

  2、不在數據端額外的消耗性能


免責聲明!

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



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