asp.net mvc框架之EF的使用


一、EF(Entity Framework)簡介

1.ORM:Object Relation Mapping,用操作對象的方法來操作數據庫

2.ORM工具有很多:Dapper、PetaPoco、NHibernate,其中用的最多的還是微軟官方的Entity Framework

3.EF底層仍然是對ADO.Net的封裝。EF支持SQLServer、MySQL、Oracle等主流數據庫

4.使用EF進行數據庫開發的時候有兩個步驟需要創建:一個是數據庫,另一個是模型類。根據這兩種創建的先后順序有EF的三種創建辦法:

  a).DataBase First(數據庫優先):先創建數據庫表,然后自動生成EDM文件,EDM文件生成模型類。

  b).Model First(模型優先):先創建Edm文件,Edm文件自動生成模型類和數據庫

  c).Code First(代碼優先):自己寫模型類,然后自動生成數據庫。沒有Edm文件。

DataBase First簡單、方便,但是當項目打了之后會非常痛苦;Code First入門門檻高,但是適合大項目。雖然有三種創建方法,一旦創建好了數據庫、模型類之后,后面的用法都是一樣的。業界推薦使用Code First,新版的EF中只支持Code irst,所以在以后的使用中,就按照Code First的方法創建使用EF。

其中EF像ASP.Net MVC一樣,采用的也是"約定大於配置"的設計原則,省去了很多的配置,能用約定就不要自己配置。

 

二、EF的初步使用

1.安裝EntityFramework

通過使用程序包管理器控制器:Install-Package EntityFramework

2.EF模型的有兩種配置方式:分別為DataAnnotations、FluentAPI兩種。其中DataAnnotations這種方式比較方便,但是耦合度太高,不適合大型項目開發的要求;FluentAPI這種方式在以后是經常使用。

2.1 DataAnnotations方式配置EF:

2.1.1 在安裝好EF后,web.config配置文件自動幫我們配置了EF的相關配置,接下來就是寫字符串連接數據庫。

<connectionStrings>
<add name="conn1" connectionString="Data Source=數據庫地址;Initial Catalog=數據庫名稱;Integrated Security=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>

注意:在配置數據庫連接字符串中,一定要寫在<configSections>節點之后,不然會提示報錯的,並且一定要添加 providerName="System.Data.SqlClient",不然會出現以下錯誤:

2.1.2 創建表T_Persons,創建實體類Person

[Table("T_Persons")]
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }

    }

實體類中的主鍵名字必須為Id,創建的類的字段名與數據庫里的表列名一致,這樣就可以使表和實體類產生自動映射關系了。當然,如果主鍵名和模型類的名字不一致,在實體類的主鍵屬性上面添加[Key],這樣就可以產生映射關系了,如果其他屬性與表中列名不一致,就要用[Column("Name")]來指定。實體類名字和表名不一致,使用[Table("表名")]來指定。

必填字段標注[Required]、字段長度[MaxLength(5)]、可空字段用 int?、如果字段在數據庫中有默認值,則要在屬性上標注[DatabaseGenerated]。

另外注意實體類都要寫成public。

2.1.3 創建DbContext類

public class MyDbContext:DbContext
    {
        public MyDbContext():base("name=conn1")
        {
            //name=conn1表示使用連接字符串中名字為conn1的取去連接字符串
        }

        public DbSet<Person> Persons { get; set; }
    }

其中該類必須繼承DbContext類,必須要寫構造函數,同時,如果有多少個實體類,該類就有多少個DbSet<T>數據類型的屬性。

2.1.4 使用EF操作數據庫(添加一個數據)

//第一步:new一個DbContext類的子類
            MyDbContext mdt = new MyDbContext();
            //第二步:new一個實體類
            Person p1 = new Person();
            p1.Name = "張三";
            p1.Age = 22;
            //第三步:將數據保存到數據庫中
            mdt.Persons.Add(p1);
            mdt.SaveChanges();

注意:MyDbContext對象是否需要using有爭議,不using也沒事,。每次用的時候new一個MyDbContext對象就行,不用共享,共享反而會有問題。在EF的開發團隊都要說要using DbContext類,當然能如果不using的話,使用LazyLoad,但是這樣做使違反分層原則的。

如果發生了數據錯誤,可能就出現在SaveChanges上面。

2.2.1 使用FluentAPI配置方式

和DataAnnotations配置方式的2.1.1,2.1.2步驟一致,故不再描述

2.2.3 創建DbContext類

和DataAnnotations中的DbContext類略微的不同,重寫了OnModelCreating方法

public class MyDbContext:DbContext
    {
        public MyDbContext():base("name=conn2")
        {

        }
        public DbSet<Student> Students { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //從某個程序集中加載所有繼承自EntityTypeConfiguration類到配置中
            modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
        }
    }

2.23 創建實體類的配置類

public class StudentConfig:EntityTypeConfiguration<Student>
    {
        public StudentConfig()
        {
            this.ToTable("T_Students"); //代表和數據里的T_Students表進行映射
        }
    }

這個類是每創建一個實體類,就跟隨的創建一個配置類

2.24 此時操作數據庫

 

三、使用EF實現增刪查改

在上面的例子中已經實現了增加數據,接下來就實現刪,查,改

3.1 刪

var getStu = md.Students.Where(s => s.Id == 2).SingleOrDefault();
            md.Students.Remove(getStu);
            md.SaveChanges();
            Console.WriteLine("刪除成功!");

 

3.2 查

var allStudents = md.Students.Where(s => s.Id >= 1);
            foreach (var student in allStudents)
            {
                Console.WriteLine(student.Id);
            }

 

3.3 改

var stu=md.Students.Where(s => s.Id == 3).SingleOrDefault();
            stu.Name = "李四";
            stu.Age = 12;
            md.SaveChanges(); 

總結:增刪查改就是操作繼承DbContext類的子類,獲取數據進行操作,組后調用SaveChanges()方法進行保存


免責聲明!

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



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