zoukankan      html  css  js  c++  java
  • EF CodeFirst 创建数据库

       最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。

       十年河东十年河西,莫欺少年穷

       学无止境,精益求精

       话说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; }
        }

       @陈卧龙的博客

     

     

  • 相关阅读:
    49. Group Anagrams
    43. Multiply Strings
    22. Generate Parentheses
    17. Letter Combinations of a Phone Number
    8. String to Integer (atoi)
    【转】C#中base关键字的几种用法:base()
    【转】C#中virtual和abstract的区别
    [转]C#中的abstract 类和方法
    【转】C#虚方法virtual详解
    【转】C#中protected用法详解
  • 原文地址:https://www.cnblogs.com/chenwolong/p/CodeFirstDB.html
Copyright © 2011-2022 走看看