EF CodeFirst 如何通過配置自動創建數據庫<當模型改變時>


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

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

   學無止境,精益求精

   本篇為進階篇,也是彌補自己之前沒搞明白的地方,慚愧慚愧。

   如有不明白,請參考:EF CodeFirst 創建數據庫 及 EF CodeFirst增刪改查之‘CRUD’

   話不多說,直接上代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EF_Test.DAL
{
    public class StudentInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<StudentContext>
    {
        protected override void Seed(StudentContext context)
        {
            //添加學生
            var studentList = new List<Student>
           {
                new Student{Name = "陳依依", Sex = "", StudentNum = "081309201"},
                new Student{Name = "戚永景", Sex = "", StudentNum = "081309202"},
                new Student{Name = "劉華麗", Sex = "", StudentNum = "081309203"},
                new Student{Name = "薛正欽", Sex = "", StudentNum = "081309204"},
                new Student{Name = "王松濤", Sex = "", StudentNum = "081309205"},
                new Student{Name = "王自龍", Sex = "", StudentNum = "081309206"},
                new Student{Name = "高其峰", Sex = "", StudentNum = "081309207"},
                new Student{Name = "陳欣欣", Sex = "", StudentNum = "081309208"},
                new Student{Name = "陳麗陽", Sex = "", StudentNum = "081309209"}
           };
            studentList.ForEach(s => context.Students.Add(s));
            context.SaveChanges();
            //添加課程
            var courseList = new List<Course>
            {
                new Course{ Name="數據結構"},
                new Course{ Name="計算機原理"},
                new Course{ Name="網絡技術"}
            };
            courseList.ForEach(s => context.Courses.Add(s));
            context.SaveChanges();
            //添加分數
            var scoreList = new List<Score>()
            {
                new Score{ StudentID=1,CourseID=1,StudentScore=90},
                new Score{ StudentID=2,CourseID=1,StudentScore=91},
                new Score{ StudentID=3,CourseID=1,StudentScore=92},
                new Score{ StudentID=4,CourseID=1,StudentScore=93},
                new Score{ StudentID=5,CourseID=1,StudentScore=94},
                new Score{ StudentID=6,CourseID=1,StudentScore=95},
                new Score{ StudentID=7,CourseID=1,StudentScore=96},
                new Score{ StudentID=8,CourseID=1,StudentScore=97},
                new Score{ StudentID=9,CourseID=1,StudentScore=98}
            };
            scoreList.ForEach(s => context.Scores.Add(s));
            context.SaveChanges();
        }
    }
}

 

   模型類如下:

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.DAL
{
    public class Student
    {
        [Key]
        public int Id { get; set; }
        [Required]
        [StringLength(10)]
        public string Name { get; set; }//姓名
        [StringLength(2)]
        public string Sex { get; set; }//性別
        [StringLength(20)]
        public string StudentNum { get; set; }//學號
    }

    public class Course
    {
        [Key]
        public int Id { get; set; }
        [Required]
        [StringLength(20)]
        public string Name { get; set; }//課程名稱
    }

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

        public int StudentScore { get; set; }//學生分數

        public int StudentID { get; set; }//學生ID

        public int CourseID { get; set; }//課程ID

        public virtual Student Student { get; set; }//virtual關鍵字修飾,用於延遲加載 提高性能 只有顯式調用時  屬性==對象

        public virtual Course Course { get; set; }//virtual關鍵字修飾,用於延遲加載 提高性能 只有顯式調用時  屬性==對象
    }

    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>();
        }
    }
}

   OK,截止到這兒,您可能會問我,protected override void Seed()這個重寫的方法什么時間執行呢?

   在此,需要兩點要求

   1、在web.config中<entityFramework>接點下加入如下配置:

    <contexts>
      <context type="EF_Test.DAL.StudentContext, EF_Test">
        <databaseInitializer type="EF_Test.DAL.StudentInitializer, EF_Test" />
      </context>
    </contexts>

   根據上述類文件,我們應該明白EF_Test是個命名空間,EF_Test.DAL.StudentContext是數據庫上下文,EF_Test.DAL.StudentInitializer是初始化類

   2、加上了上述配置,還需模型結構發生改變時,程序才會自動執行Seed()方法,例如:將字段長度由50改為20

   綜上所述條件滿足后,程序就會自動重新刪除數據庫並建立

   @陳卧龍的博客

 


免責聲明!

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



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