EF的簡單認識

EF簡介     web

EntityFramwork是微軟提供的一款ORM框架(Object Relational Mapping),實體映射模型,它的底層是ADO.NET的機制,使用EF將省去了咱們對數據訪問層的代碼的編寫,省去了對於SQLHelper等對數據庫的操做邏輯,可讓咱們把更多的時間放在上層方面的實現上。只要是操做數據的項目均可以使用EF簡化對數據層的維護,相似的ORM框架還有不少比較輕量級的框架,此處沒有研究。sql

EF的安裝和使用問題數據庫

可使用從微軟的工具Nuget上直接獲取,在EF的使用使用過程當中,可能會遇到一些錯誤,本人在學習的時候就遇到了一些問題。app

1.遇到建立EF數據模型文件的時候,發現沒有ADO.NET實體數據模型的模板框架

解決方法:ide

在C:\ProgramData\Package Cache\下面搜索到EFTools.msi函數

vs2012對應的是EFTools V11工具

vs2013 對應的是EFTools V12sqlserver

2.在使用EF6的時候,遇到編譯錯誤性能

正在在編譯轉換:未能找到元數據文件「」%VS120COMNTOOLS..\IDE\EntityFramework.dll%

解決方案:

這類問題就是設置系統的環境變量VS120COMNTOOLS的設置的路徑是不正確的,因此須要制定一個正確的路徑,這個路徑下必定要包含IDE文件夾,在IDE文件加下,必定要包含着相應的dll文件

個人電腦-右擊屬性-高級系統設置-高級-環境變量-選擇系統變量中找到這個變量

個人正確設置的路徑是E:\VS2013和Sql安裝文件\VS2013Install\Common7,這個文件路徑就是個人VS的安裝目錄沒在這個目錄的下一級就是IDE,裏面已經包含着相應的Dll文件

EF的開發模式

DataBaseFirst

下面將使用空的Web演示操做步驟:

1.首先建立一個空的web應用程序

2.安裝好之後,點擊添加 數據-ADO.NET 實體模型,文件的後綴名字是model1.edmx,此時彈出來選擇的類型:從數據庫中生成:就是所謂的DataBaseFirst

                  空模型:ModelFirst

3.而後新建鏈接選擇對應的數據庫和表(對於敏感數據那一項直接打鉤)

4.完成後會有幾個文件添加進來

Model1.tt:T4模板,這個是代碼生成工具,就是用來生成實體模型類,微軟的代碼生成工具的後綴名都是.tt

Model.edmx.diagram:這是和實體模型設計器相對應,用來描述模型的。

。。。

此時全部的需選擇出的數據庫中的表都已經在項目中生成相應的model,同時爲咱們生成一個數據操做類繼承自DbContext

代碼語法操做

添加數據

            Useruser=newUser();

            user.UserName="zhaohongjian";

            user.Password="123";

            AddressListEntitiesdb=newAddressListEntities();//上下文對象,鏈接數據庫和實體類

            db.User.Add(user);

            //db.User至關於一個內存數據

            db.SaveChanges();//存取到數據庫中

            Response.Write(User.ID);//系統中默認的返回的是剛剛插入的數據的主鍵的ID,也就是說,能夠獲取到一些數據庫中的信息,由於已經SaveChanges()了

 

           AddressListEntities這個類是繼承自DbContext類,當對象實例化的時候,會調用父類的構造函數,將鏈接字符串傳入進去。在AddressListEntitie這個類中存在着

publicDbSet<User>User { get; set; },這個和數據庫中的表示相鏈接的,也就是不改動的話,他們存放的數據是同樣

          注意:

      Db.User.Add(user1);

      Db.User.Add(user2);

      Db.SaveChanged();

      屢次數據庫的操做,可是EF只用操做一次就所有執行了,這是集成了工做組模式,大大減小了對於數據操做的頻率,提升性能。同時SaveChange()方法內部實現了事務模式,出現失誤會進行回滾操做 

 

 

 

查詢:

EF中的查詢採用的是延遲加載的機制,也就是當使用的時候纔會進行查詢操做

EF中的查詢是支持Linq的

      protectedvoidButton2_Click(object sender, EventArgs e)

        {

            AddressListEntitiesentity=newAddressListEntities();

            IQueryable<User>resultList=from cell in entity.User

                                          where cell.UserName=="zhaohongjian"

                                          select cell;//由於至關於連通器,因此能夠直接操做內存中的模擬數據表,可是此時並無用到相應的數據,因此此時並無查詢數據庫

            Response.Write(resultList.FirstOrDefault<User>().Password);//此時纔會去查詢數據庫

        }

 

刪除:

           1.先進行查詢出想要刪除的數據,而後使用刪的API,沒法直接構建一個user實例,直接刪除,由於本身直接構建的user類實例,沒有實現模擬表與數據庫中表的映射。

          //先查詢

            AddressListEntitiesentity=newAddressListEntities();

            IQueryable<User>resultList=fromcellinentity.User

                                          wherecell.UserName=="zhaohongjian"

                                          selectcell;

           //再刪除

            entity.User.Remove(resultList.FirstOrDefault());//這些操做只是在操做的內存中的模擬表

          entity.SaveChanges();

           2.使用本身定義的類的實例,而後手動綁定(Entry

           Useruser=newUser() { UserName="zhaohongjian" };

            AddressListEntitiesdbContext=newAddressListEntities();

            dbContext.Entry<User>(user).State=System.Data.EntityState.Deleted;//手動的打上標記,在內存的模擬表中刪除,同時實現與數據庫的映射,將user

            dbContext.SaveChanges();

 

 

更新:

對於更新是沒有對應的直接修改模擬表的Update方法,因此可使用添加標記並刪除模擬表的方式進行修改

具體的使用方式也是有兩種,和刪除的時候是相似的

  1. 先查詢後更新(使用打標記更新)
  2. 本身構造而後打標記

AddressListEntitiesdbContext=newAddressListEntities();

            Useruser=newUser() { UserName="zhaohongjian", Password="ddd" };

            dbContext.Entry<User>(user).State=EntityState.Modified;

            dbContext.SaveChanges();

 

ModelFirst

modelFirst的操做就是在建立ADO.NET實體數據模型的時候,選擇的模板是空模板,此時將會直接載入Model1.tt,Model.edmx.diagram,而後直接在實體操做界面直接進行建立就行了,右擊添加實體模型,而後可使用右擊-添加標量屬性,添加普通的屬性,同時可使用F4直接調出屬性界面,在裏面對屬性進行相應的設置,右擊-添加導航屬性,能夠構建兩個實體之間的關係,實現一對多等關係的映射,導航屬性,可使得模型之間能夠相互調用。

 

當模型建立完畢以後,而後保存一下,應該就會生成相應的model文件(沒顯示出來也是沒有關係的),而後右擊-根據模型更新數據庫,而後會生成相應的DDL文件

 

點擊完成以後會產生xxx.sql文件,你能夠直接在VS中執行這個文件,而後會在數據庫生成相應的數據表,固然你能夠將sql文件中的省sql語句考到sqlserver中去執行便可

具體的配置已經完畢,關於代碼的使用,跟DataBaseFirst使用是同樣的

注意事項:關於模型的修改,當從新添加一格model的時候,你須要再次操做根據模型生成數據,生成的sql文件必定不要着急的去執行,首先須要將前面的Drop語句刪掉,由於EF會將你之前的表所有刪除,而後所有從新生成,全部若是不刪除的話,之前的數據將會丟失。對於某一個model中的屬性的修改,直接在數據庫中將表改一下,就能夠了,沒有必要操做「根據模型生成數據庫」。

 

CodeFirst

其實就是咱們用本身搭建代碼的形式,將VS建立的過程徹底的模擬出來,代碼基本上都是按照VS自動生成的仿照。

建立相相應的codeFirst以前,添加相應的類庫

System.ComponentModel.DataAnnotations.dll(這個類庫是系統的,用來標記特性)

EntityFramework.dll(添加的EF的package中)

System.Data.Entity.dll(系統)

1.建立相應的實體類,並對實體類添加相應的特性

public  classClass

    {

      [Key]

      publicintId { get; set; }

      [Required]

      [StringLength(32)]

      publicstringClassName { get; set; }

      publicvirtualICollection<Student>StudentInfo { get; set; }

    }

public   classStudent

    {

       [Key]

        publicintStudentId { get; set; }

        [Required]

        [StringLength(32)]

        publicstringStudentName { get; set; }

        publicvirtualClassClassInfo { get; set; }

    }

2.配置config文件,主要是將數據庫鏈接字符串添加到配置文件中

<connectionStrings >

    <add name="connStr" connectionString="server=.;database=mm;uid=****;pwd=****" providerName="System.Data.SqlClient" />

  </connectionStrings>

3.編寫咱們本身的數據訪問上下文類,這個類必須繼承自DbContext

public   classMyDbContext:DbContext

    {

        publicMyDbContext()

            : base("name=connStr")

        { }

        protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder)

        {

          //這句代碼的做用就是去除生成的數據中的表格是複數的形式,保持原來的命名         

           modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        }

        publicDbSet<Class>Class { get; set; }

        publicDbSet<Student>Student { get; set; }

}

4.就能夠直接使用了

classProgram

    {

        staticvoidMain(string[] args)

        {

            MyDbContextdbContext=newMyDbContext();

            Classclass1=newClass { ClassName="趙家班" };

            dbContext.Database.CreateIfNotExists();

            dbContext.Class.Add(class1);

            dbContext.SaveChanges ();

        }

    }

備註:以上只是本身對EF學習的一點記錄,若有錯誤,歡迎批評指正

相關文章
相關標籤/搜索