Asp.Net MVC 常用開發方式之EF Code First


    在我們的工作和學習當中,經常會遇到中小型項目,這些項目除了業務上的區別較大外,對於底層和數據訪問,其實都差不多。記得以前做項目時,每次都要重復的寫底層操作數據庫的代碼,不僅浪費時間,也無太大意思,后來接觸到了Entity Framework,Linq等技術,發現底層原來可以這么簡單,既縮短了大量的開發時間,又提高了代碼質量。

   今天就向大家演示兩種搭建底層和技術,在此,也給自己做一個筆記。

  CodeFirst,用中文說是代碼優先,此技術可以讓我們先寫代碼,然后由Entity Framework根據我們的代碼建立數據庫。一開始聽上去很神奇,接下來,我將用圖文並茂的方式,演示出來:

  用學生的那個例子來演示的話,有三張表:學生表,課程表,和成績表。於是,我們在建好的ASP.NET MVC 項目中的Model層,新建這樣三個類

 

View Code
namespace CodeFirstDemo.Models
{
    public class Course
    {
        [Key]
        public int Id { get; set; }

        [Required]
        [StringLength(50)]
        public string Name { get; set; }
    }
}

 

View Code
namespace CodeFirstDemo.Models
{
    public class Student
    {
        [Key]
        public int Id { get; set; }

        [Required]
        [StringLength(50)]
        public string Name { get; set; }
    }
}
View Code
namespace CodeFirstDemo.Models
{
    public class Score
    {
        [Key]
        public int Id { get; set; }

        public Student Student { get; set; }

        public Course Course { get; set; }
    }
}

如大家所想的那樣,這三個類的屬性其實就對應了數據庫的表結構,值得一提的是,屬性為的頭上有"[Key]"或"[Required]"的標識,其中[Key]表示在數據庫中該字段為主鍵,[Required]表示不為空,[StringLength]也就是長度了。同時,在Model層和這種標識,也用於客戶端和后台的數據驗證,MVC的這種模式,相比三層架構來看,着實方便了好多呀(這里只是本人愚見,WebForm中能不能用這種方式驗證,我也不知道額,這里留下一個標記,以后研究研究)。

 

接着,我們需要用上面寫好的類來生成數據庫了,這里我們要利用一個工具,叫EFCodeFrist,可以利用安裝ASP.NET MVC 3時自帶的NUGet管理器來搜索這個工具,然后點擊安裝,這當然是最方便的辦法,可以一試,但是各種問題,各種安裝不了,各種安裝錯誤,很容易打擊我們的學習積極性,所以安裝不了,我們可以去Visual Studio Gallery下載,其實,只需要引用一個叫做Entity Framework的dll類庫即可,如圖

 

,這一步完成之后,我們要建立一個StudentInfoEntities的類,這個類要繼承自DbContext,而DbContext類在System.Data.Entity命名空間下,該命名空間在沒有引用EntityFramework.dll類庫的前提下是無法using到的。我們安裝EFCodeFirst工具,也就是為了在VS每次創建項目的時候能自動的引用這個dll。

StudentInfoEntities類中的代碼如下:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace CodeFirstDemo.Models
{
    public class StudentInfoEntities : DbContext
    {
        public DbSet<Student> Students { get; set; }

        public DbSet<Course> Courses { get; set; }

        public DbSet<Score> Scores { get; set; }
    }
}

最后,我們在Web.Config里配置一下數據庫的連接字符串,

  <connectionStrings>
    <add name="StudentInfoEntities" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=StudentInfo;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>

注意,name屬性的值必須與繼承自DbContext的類名一致,這樣EntityFramework在web.config里才能找到正確的連接字符串,從而訪問數據庫。如果不寫連接字符串,或者name的值不同,EF也會嘗試連接本地的數據庫,不過生成的數據庫名,會是項目名.Models.StudentInfoEntities,一切取決於您了。

一切配置完成之后,就開始運行程序了,顯然,當我們點擊調試按鈕之后,什么都沒有發生。。。因為,我們需要一個觸發條件,就是寫一段讀取數據庫的代碼,這樣,EF會根據web.config的連接來讀取數據庫,如果發現數據庫中沒有,才會自動創建它,如果已存在,則讀取里面的數據並返回。

新建一個HomeController,在Index方法中加入代碼:

View Code
namespace CodeFirstDemo.Controllers
{
    public class HomeController : Controller
    {
        private StudentInfoEntities db = new StudentInfoEntities();

        public string Index()
        {
            var data = db.Students.ToList();
            return "Database is build success!";
        }

    }
}

這樣,再運行一個程序,當界面顯示出字符的時候,去數據庫看一下,數據庫是不是自動生成了呢?

同時,您會發現,在Score表中,自動產生外鍵關系,是不是很方便呢。

 

 


免責聲明!

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



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