zoukankan      html  css  js  c++  java
  • EntityFramework Code-First教程(一)

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

     EF框架有三种设计模式:Code-First、Model-First、Database-First,本篇讨论Code-First

    (EF6已开源,网址:http://entityframework.codeplex.com/

    • 什么是Code-First?

      Entity Framework 从EF4.1开始包含Code-First模式,Code-First主要用在Domain Driven Design(领域驱动设计)中。在Code-First模式中,我们针对每一个功能要求创建一个模型类(Domain Class),把关注点放在一个领域里,Code-Fiist 将会根据我们的模型类和配置自动创建数据库。

      

      当我们程序运行的时候,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

    点击安装

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

    这样,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();                
            }
        }
    }
    复制代码

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

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

    Entity Framework code-first example

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

    注意:StudentId和StandardId自动设置为主键,Students表里自动创建了一个Standard_StandardId的外键,这是因为Student类里有一个Standerd类的属性,你肯定疑问怎样定义外键名,那下篇我们就来介绍Code-First约定。

  • 相关阅读:
    《高效休息法》IT从业者如何高效休息
    《逆向管理-先行动后思考》
    《时间管理》总结
    Java面试,面试题
    Java线程池解析
    Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解
    Docker私服搭建--Harbor
    一:优化Docker中的Spring Boot应用:单层镜像方法
    七:Spring Security 前后端分离登录,非法请求直接返回 JSON
    python selenium模块使用出错-selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
  • 原文地址:https://www.cnblogs.com/kennyliu/p/9359314.html
Copyright © 2011-2022 走看看