最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。
十年河東十年河西,莫欺少年窮
學無止境,精益求精
本篇為進階篇,也是彌補自己之前沒搞明白的地方,慚愧慚愧。
如有不明白,請參考: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
綜上所述條件滿足后,程序就會自動重新刪除數據庫並建立
@陳卧龍的博客