程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> EF CodeFirst 創建數據庫,efcodefirst

EF CodeFirst 創建數據庫,efcodefirst

編輯:關於.NET

EF CodeFirst 創建數據庫,efcodefirst


   最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。

   十年河東十年河西,莫欺少年窮

   學無止境,精益求精

   話說EF支持三種模式:Code First   Model First   DataBase First,微軟最新的EF框架,也就是EF7捨棄了Model First 和 DataBase First,咱們作為最底層的程序員必須跟著‘黨’的走,既然微軟都放棄了Model First 和 Database First,那麼我們也應當跟著‘黨’的路線走,表示堅決擁護‘黨’的決定,堅決走Code First路線。

   在此:僅僅作為入門,講解下EF CodeFirst 創建數據庫。

   首先我們創建一個MVC項目,並在Model中添加如下類庫:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace EF_Test.Models
{
    public class Student
    {
        [Key]
        public int Id { get; set; }
        [Required]
        [StringLength(50)]
        public string Name { get; set; }
        public string Sex { get; set; }
    }
    public class Course
    {
        [Key]
        public int Id { get; set; }
        [Required]
        [StringLength(50)]
        public string Name { get; set; }
    }

    public class Score
    {
        [Key]
        public int Id { get; set; }

        public int StudentScore { get; set; }

        public Student Student { get; set; }

        public Course Course { get; set; }


    }

    public class StudentContext : DbContext
    {
        public DbSet<Student> Students { get; set; }
        public DbSet<Course> Courses { get; set; }
        public DbSet<Score> Scores { get; set; }
    }
}

   或者如下代碼

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using System.Web;

namespace EF_Test.Models
{
    public class Student
    {
        [Key]
        public int Id { get; set; }
        [Required]
        [StringLength(50)]
        public string Name { get; set; }
         [StringLength(2)]
        public string Sex { get; set; }
         [StringLength(50)]
        public string StudentNum { get; set; }
    }

    public class Course
    {
        [Key]
        public int Id { get; set; }
        [Required]
        [StringLength(50)]
        public string Name { get; set; }
    }

    public class Score
    {
        [Key]
        public int Id { get; set; }

        public int StudentScore { get; set; }

        public Student Student { get; set; }

        public Course Course { get; set; }


    }

    public class StudentContext : DbContext
    {
        public StudentContext()
            : base("StudentContext")
        {

        }
        public DbSet<Student> Students { get; set; }
        public DbSet<Course> Courses { get; set; }
        public DbSet<Score> Scores { get; set; }

        /// <summary>
        /// OnModelCreating方法中的modelBuilder.Conventions.Remove語句禁止表名稱正在多元化。如果你不這樣做,所生成的表將命名為Students、Courses和Enrollments。相反,表名稱將是Student、Course和Enrollment。開發商不同意關於表名稱應該多數。本教程使用的是單數形式,但重要的一點是,您可以選擇哪個你更喜歡通過包括或省略這行代碼的形式。
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

   然後,我們在控制器中添加如下代碼:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using EF_Test.Models;

namespace EF_Test.Controllers
{
    public class HomeController : Controller
    {
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            var StudentModel = new Student
            {
                Name = "陳臥龍",
                Sex="男"
            };

            var CourseModel = new Course()
            {
                Name="數據結構"
            };

            var ScoreModel = new Score()
            {
                Student = StudentModel,
                Course = CourseModel,
                StudentScore = 98
            };
            //
            using (var context = new StudentContext())
            {
                context.Students.Add(StudentModel);
                context.Courses.Add(CourseModel);
                context.Scores.Add(ScoreModel);
                context.SaveChanges();
            };
            
            return View();
        }
    }
}

   下面我們來分析下:

   我們創建了三個實體類:Student、Course、Score 分別代表:學生、課程、成績

   一個上下文類StudentContext,繼承自DBContext,擁有三個屬性:Students、Courses、Scores,這三個屬性代表三張數據表,分別映射對象:Student、Course、Score

   控制器中我們嘗試為各個對象創建數據,並插入數據庫

   我們來運行程序:

   運行結果:並沒有生成數據庫

   究其原因,是我們的項目中沒有指定連接字符串,我指定的連接字符串如下:

   

   注意:連接字符串的Name值必須和上下文類一致,連接字符串要結合本機進行生成,我的數據庫為:

   

   加上連接字符串後,我們可以正常生成數據庫,如下:

   

   

    現在問題來了,如果我們修改Model對象,數據庫表結構及數據會相應變化嗎?

   我們將Student 修改為:

 public class Student
    {
        [Key]
        public int Id { get; set; }
        [Required]
        [StringLength(50)]
        public string Name { get; set; }
         [StringLength(2)]
        public string Sex { get; set; }
         [StringLength(50)]
        public string StudentNum { get; set; }
    }

   運行程序:

   大致意思是告訴我們:數據上下文類結構發生了變化且數據庫已經創建了,請使用代碼優先數據遷移修改數據庫

   咋辦?

   這時候,我們引入另一個話題:EF數據庫初始化的幾種方式

   那麼EF有幾種數據庫初始化方式呢?

   有興趣的小虎斑可以查看我的博客:Entity FrameWork初始化數據庫的四種策略

   說來也慚愧,上述博客是我兩年前所寫,而我至今對EF還是一知半解,模模糊糊,嘻嘻,慚愧慚愧。

   一步一個台階,總會步入青雲,扯遠啦,咱繼續:

   在EF初始化數據庫時,有四種策略:

   一、 每次運行都會創建新的數據庫

   Database.SetInitializer<XXXXXContext>(new DropCreateDatabaseAlways<XXXXXContext>());

   二、只有第一次運行~才會創建新的數據庫~默認的方式

   Database.SetInitializer<XXXXXContext>(new CreateDatabaseIfNotExists<XXXXXContext>());

   三、 修改模型後~運行~會創建新的數據庫

   Database.SetInitializer<XXXXXContext>(new DropCreateDatabaseIfModelChanges<XXXXXContext>());

   四、使用自己配置的數據庫,請到:web.config中配置自己的連接字符串,注意連接字符串的名稱應與上下文:XXXXContext的名字一致。

   Database.SetInitializer<Models.musicStoreContext>(null);

   根據上述我們的需求:我們的模型發生了變化,我們應當采用:第三種形式,因此:我們在APP_Start中添加如下代碼:

   

     控制器添加個學號:

   

    重新運行項目,我們得到如下結果:

   

   注:如果運行後,告訴你數據庫正在使用,刪除數據庫失敗,請把項目解決方案清空並關閉數據庫,然後運行項目。

   以下供自己查看,嘻嘻

  public class StudentContext : DbContext
    {
        public StudentContext()
            : base("StudentContext")//指定連接字符串
        {

        }
        public DbSet<Student> Students { get; set; }
        public DbSet<Course> Courses { get; set; }
        public DbSet<Score> Scores { get; set; }
    }

   @陳臥龍的博客

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved