EF Codefirst學習系列三:種子數據


1、寫在前面

  前面寫了數據庫自動生成,有的朋友可能會發現了,這玩意不好用啊,我辛辛苦苦寫了好久的測試數據,自動建庫時一下子清了個干干凈凈,再測試又要辛辛苦苦的重新創建,這不是坑人嗎!嗯,你說的很對,是很坑,我也覺得很坑,所以今天咱們來學更好的方法。

2、開搞

  想保留測試數據的話有兩種方式可以實現,這里先說說第一種:創建種子數據。

  假設這樣一個場景,有一天咱們正在開開心心的擼代碼,突然領導過來說:猿猿,先把你手里的活放放,這里有一個學生管理系統比較緊急,先把這個搞搞吧。雖然咱們很不爽被打斷,但是本着敬(gong)業(zi)精神,也只能接受了,那么開始做吧。

  學生管理系統嘛,肯定得有學僧啊,於是咱們先建一個學生類Student:

public class Student
    {
        public int SId { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public virtual IList<Course> Courses { get; set; }
    }

  學僧每天干啥,當然是上課了,所以再來一個課程類Course:

public class Course
    {
        public int CId { get; set; }
        public string Name { get; set; }
        public int SId { get; set; }
        public Student Student { get; set; }
    }

  好了,就先弄這兩個就行了,先把數據庫搞起來,配置字符串,數據庫初始化設置為DropCreateDatabaseIfModelChanges(有關該類詳細介紹及配置請參考第二篇)模式,建立DbContext類,啟動。。。。坐等數據庫建好~~~然而,偉大的征程總是會有困難出現的,這不困難來了,報錯了,信息如下:

Course: EntityType: EntitySet 'Course' is based on type 'Course' that has no keys defined.
Student: EntityType: EntitySet 'Student' is based on type 'Student' that has no keys defined.

意思呢就是這兩個類沒有主鍵,因為一般來說表是應該有主鍵的,唯一標識,查起來也快,沒主鍵EF不給你干活,算了,它想要咱們就給它唄,還能跟它干起來不成,怎么加呢,兩種方式:設置特性重寫方法

設置特性即利用命名空間DataAnnotation下的Key特性來告訴EF某個屬性是主鍵,如:

[Key]
public int SId { get; set; }

重寫方法即DbContext類中的OnModelCreating方法,如:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>().HasKey(s => s.SId);
            modelBuilder.Entity<Course>().HasKey(c => c.CId).HasRequired(c => c.Student).WithMany(s => s.Courses).HasForeignKey(c => c.SId);
            base.OnModelCreating(modelBuilder);
        }

其中,HasKey方法就是設置model主鍵的。

二者任選其一就行了,OK~障礙排除,繼續啟動坐等數據庫建立,這次沒有問題直接成功:

哎哎哎,等等,這就建好庫了?不是說好搞什么種子數據的嗎,數據呢?別急,一步步來。

  IDatabaseInitializer接口定義了一個Seed約束,作用是創建種子數據的,實現這個接口的類都會有這個方法,咱們就建立一個類繼承DropCreateDatabaseAlways重新建庫來實現種子數據的創建吧。

public class DbInitializer:DropCreateDatabaseAlways<GGDbContext>
    {
        protected override void Seed(GGDbContext context) { context.Student.Add(new Student() { Name = "tom",Age=3}); context.Student.Add(new Student() { Name = "angela", Age = 2 }); context.Course.Add(new Course() { Name = "撓癢", Student = new Student() { Name = "ben", Age = 12 } }); context.Course.Add(new Course() { Name = "放屁", Student = new Student() { Name = "jimmy", Age = 6 } }); base.Seed(context); } }

然后在Global.asax中將數據庫初始化類設置成咱們自定義的類就行了。

Database.SetInitializer(new DbInitializer());

這樣創建數據庫時就能把上面你添加的數據自動插入到表中用於測試,當然你可以多加點數據。

有了,正是咱們設置的初始化數據。破費!

3、結局

  OK,這一篇到這里先結束吧,本來打算在這篇里將數據遷移也記錄下,不過感覺篇幅肯定比較大,我個人看的時候是最怕這種長篇累牘的文章的,學習效率會很低,所以打算在下一篇里單獨寫數據遷移,也是最重頭的部分,敬請期待哦~

 

  


免責聲明!

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



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