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

       @陈卧龙的博客

     

     

  • 相关阅读:
    (网页)中的简单的遮罩层
    (后端)shiro:Wildcard string cannot be null or empty. Make sure permission strings are properly formatted.
    (网页)jQuery的时间datetime控件在AngularJs中使用实例
    Maven Myeclipse 搭建项目
    MyBatis 环境搭建 (一)
    java 常用方法
    XML 基础
    JS BOM
    js 事件
    js 的使用原则
  • 原文地址:https://www.cnblogs.com/chenwolong/p/CodeFirstDB.html
Copyright © 2011-2022 走看看