zoukankan      html  css  js  c++  java
  • EF CodeFirst系列(1)---CodeFirst简单入门

    1.什么是CodeFirst

      从EF4.1开始,EF可以支持CodeFirst开发模式,这种开发模式特别适用于领域驱动设计(Domain Driven Design,大名鼎鼎的DDD)。在CodeFirst模式中,我们不再先创建数据库,然后在程序中创建对应的类;CodeFirst开发模式中我们只关注应用程序的域(Domain)直接开始创建类,EF会根据我们创建的类自动生成数据库。

    CodeFirst的工作流程如下所示:

    使用CodeFirst模式进行开发时,我们的开发流程是:创建/修改领域类-->配置领域类(使用Fluent API或者注释属性)-->新建/修改数据库架构(使用自动迁移或者代码迁移)

    2.CodeFirst的简单入门案例

    添加一个名字为EF6Console的控制台应用程序,然后把EF引入到项目中,如下图:

    添加了EF后我们就可以就行EF的CoreFirst开发了

    第一步:添加领域类

    首先添加两个Student和Grade类(学生和年纪),它们是一对多关系,一个年级有多个学生,而一个学生只能有一个年级,代码如下:

    public class Student
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public byte[]  Photo { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
            
        public Grade Grade { get; set; }
    }
    public class Grade
    {
        public int GradeId { get; set; }
        public string GradeName { get; set; }
        public string Section { get; set; }
        
        public ICollection<Student> Students { get; set; }
    }

    第二步:添加context上下文

    CodeFirst模式也需要一个context上下文类,和DbFirst开发不同,在CodeFirst模式中context类需要我们自己创建,context类继承DbContext,代码如下:

        public class SchoolContext : DbContext
        {
         //构造函数
            public SchoolContext() : base()
            {
            }
         //每个类设置一个的DbSet属性
            public DbSet<Student> Students { get; set; }
            public DbSet<Grade> Grades { get; set; }
        }

    完成了这两步,SqlServer的CodeFirst简单入门就结束了,是不是特别方便?

    我们在程序中添加一个Student,代码如下:

        class Program
        {
            static void Main(string[] args)
            {
                using (var ctx=new SchoolContext())
                {
                    Student student = new Student() { StudentName = "bill" };
                    ctx.Students.Add(student);
                    ctx.SaveChanges();
                    Console.WriteLine("初始化完成");
                }
            }
        }

    执行后数据库就自动创建了,如下图所示

      因为没有添加任何关于context的设置,所以EF安装默认规则在vs内置的sqlserver中给我们创建了 数据库,名字是EF6Console.SchoolContext(项目名.上下文名),同时给Student和Grade领域类生成了dbo.Studentsdbo.Grades(dbo.class复数)表。表中的每个列对应类的属性,后缀有Id(如studentId)的设置为主键和外键,实体实例生成了数据库的记录。当切换到CodeFirst开发时,感觉整个项目看起来都清爽了~

    注意:这时如果修改类(如Student类)的话,运行程序时会抛出异常。如我们把Student类的体重属性注释了,如下所示

        public class Student
        {
            public int StudentId { get; set; }
            public string StudentName { get; set; }
            public DateTime? DateofBirth { get; set; }
            public byte[] Photo { get; set; }
            public decimal Height { get; set; }
            //public float Weight { get; set; }
    
            public Grade Grade { get; set; }
        }

    然后运行程序,出现

    这时因为领域类(Student)改变了导致数据库中dbo.Students表的列也要随着改变,这就需要我们定义一个数据库的迁移策略(database initialization strategy),在以后的章节会介绍。

  • 相关阅读:
    淘宝质量属性场景分析
    关于软件架构师如何工作(阅读架构漫谈感悟)
    06有效需求设计阅读笔记之六
    05有效需求设计阅读笔记之五
    xxx征集系统项目目标文档
    04有效需求设计阅读笔记之四
    03有效需求设计阅读笔记之三
    02有效需求设计阅读笔记之二
    01有效需求设计阅读笔记之一
    问题账户需求分析
  • 原文地址:https://www.cnblogs.com/wyy1234/p/9647730.html
Copyright © 2011-2022 走看看