欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EntityFramework Code-First 简易教程(一)

程序员文章站 2022-06-19 10:34:35
 前言:学习了ef框架这么久,还没有好好总结一番,正好遇到一国外的,发现不错,随即翻译过来,一是让自己复习一遍,二是供广大初学者学习,翻译过程中加入了一些自己的理解,如有错误,还请指出,多谢...

 前言:学习了ef框架这么久,还没有好好总结一番,正好遇到一国外的,发现不错,随即翻译过来,一是让自己复习一遍,二是供广大初学者学习,翻译过程中加入了一些自己的理解,如有错误,还请指出,多谢多谢。好了,进入正题

 ef框架有三种设计模式:code-first、model-first、database-first,本篇讨论code-first

(ef6已开源,网址:)

  • 什么是code-first?

  entity framework 从ef4.1开始包含code-first模式,code-first主要用在domain driven design(领域驱动设计)中。在code-first模式中,我们针对每一个功能要求创建一个模型类(domain class),把关注点放在一个领域里,code-fiist 将会根据我们的模型类和配置自动创建数据库。

EntityFramework Code-First 简易教程(一)

  

 

 

 

 

  当我们程序运行的时候,code-first会创建一个新的数据库(如果不存在),并根据默认约束把模型类映射到数据库表里,一个类对应一张表,我们可以使用dataannotation或者fluent api配置模型类来重写默认约定。先别急,后面会一一介绍。

所以code-first设计的工作流程应该是:

  编写模型类和context类→配置映射要求→运行程序→创建新的数据库或者用模型类映射已存在的数据库→录入测试数据→发布最终应用程序

 

 

  • 环境配置

开发环境及工具:

  • .net framework 4.5
  • visual studio 2013
  • ms sql server 2008/2012 express

用nuget安装ef,在解决方案上右键,选中nuget

EntityFramework Code-First 简易教程(一)

 

 

 

 

 

 

 

 

 

 

 

 

 

搜索entityframework

EntityFramework Code-First 简易教程(一)

点击安装

EntityFramework Code-First 简易教程(一)

安装完成后,在我们项目引用里面就有了entityframework的程序集,我们点右键属性,发现版本是6.0

EntityFramework Code-First 简易教程(一)

这样,ef环境就搭好了。

 

 

  • 一个简单的事例

假定我们为某学校创建一个应用程序,那么这个程序应该能够添加或修改学生信息、年级信息、教师信息和课程信息。

让我们先忘记数据库设计,我们先来为“学校”这个领域创建各种类,首先,我们创建两个简单的类,student和standard,这里,每个student里面又包含了一个standard类。

public class student
{
    public 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 standard standard { get; set; }
}

 

这个standard(年级类)应该包含了多个student,一个班上肯定有很多不同的学生,所以这是“one-to-many”(一对多)的关系。

public class standard
{
    public standard()
    { 
        
    }
    public int standardid { get; set; }
    public string standardname { get; set; }
    
    public icollection<student> students { get; set; }
   
    }
}        

 

模型类写好了,我们就要开始写dbcontext,下面我们创建一个schoolcontext类,继承于dbcontext,并且以我们刚刚创建的两个模型类为泛型,显示定义的两个dbset<t>属性,属性名约定为复数形式(约定大于配置,在asp.net中这是很重要的一个设计理念)。注意,每一个模型类,都必须在dbcontext中定义一个与之对应的dbset<t>属性,代码如下:

namespace ef_code_first_tutorials
{
        
    public class schoolcontext: dbcontext 
    {
        public schoolcontext(): base()
        {
            
        }
            
        public dbset<student> students { get; set; }
        public dbset<standard> standards { get; set; }
            
    }
}

现在,我们可以在主程序里实例化一个schoolcontext,然后添加学生信息了。

class program
{
    static void main(string[] args)
    {
     
        using (var ctx = new schoolcontext())
        {
            student stud = new student() { studentname = "new student" };
        
            ctx.students.add(stud);
            ctx.savechanges();                
        }
    }
}

 

如果我们运行程序,就会插入一条学生信息到数据库里。

到这里你肯定很奇怪,数据库在哪儿?表是什么样?表中各列又是什么样?别急,让我们打开数据库一探究竟。

EntityFramework Code-First 简易教程(一)

这就是code-first模式神奇的地方,它会自动帮我们创建数据库,并且以传入dbcontext的构造函数中的参数来命名创建的数据库,因为上面实例化schoolcontext我们并没有传任何参数进去,所以它默认会以"项目名称.context名"来命名数据库。如你所见,数据库里已经根据我们上面写的两个模型类创建了两张表,表的各个列就是类的各个属性。

注意:studentid和standardid自动设置为主键,students表里自动创建了一个standard_standardid的外键,这是因为student类里有一个standerd类的属性,你肯定疑问怎样定义外键名,那下篇我们就来介绍code-first约定。