zoukankan      html  css  js  c++  java
  • Asp.Net MVC 常用开发方式之EF Code First

        在我们的工作和学习当中,经常会遇到中小型项目,这些项目除了业务上的区别较大外,对于底层和数据访问,其实都差不多。记得以前做项目时,每次都要重复的写底层操作数据库的代码,不仅浪费时间,也无太大意思,后来接触到了Entity Framework,Linq等技术,发现底层原来可以这么简单,既缩短了大量的开发时间,又提高了代码质量。

       今天就向大家演示两种搭建底层和技术,在此,也给自己做一个笔记。

      CodeFirst,用中文说是代码优先,此技术可以让我们先写代码,然后由Entity Framework根据我们的代码建立数据库。一开始听上去很神奇,接下来,我将用图文并茂的方式,演示出来:

      用学生的那个例子来演示的话,有三张表:学生表,课程表,和成绩表。于是,我们在建好的ASP.NET MVC 项目中的Model层,新建这样三个类

    View Code
    namespace CodeFirstDemo.Models
    {
        public class Course
        {
            [Key]
            public int Id { get; set; }
    
            [Required]
            [StringLength(50)]
            public string Name { get; set; }
        }
    }
    View Code
    namespace CodeFirstDemo.Models
    {
        public class Student
        {
            [Key]
            public int Id { get; set; }
    
            [Required]
            [StringLength(50)]
            public string Name { get; set; }
        }
    }
    View Code
    namespace CodeFirstDemo.Models
    {
        public class Score
        {
            [Key]
            public int Id { get; set; }
    
            public Student Student { get; set; }
    
            public Course Course { get; set; }
        }
    }

    如大家所想的那样,这三个类的属性其实就对应了数据库的表结构,值得一提的是,属性为的头上有"[Key]"或"[Required]"的标识,其中[Key]表示在数据库中该字段为主键,[Required]表示不为空,[StringLength]也就是长度了。同时,在Model层和这种标识,也用于客户端和后台的数据验证,MVC的这种模式,相比三层架构来看,着实方便了好多呀(这里只是本人愚见,WebForm中能不能用这种方式验证,我也不知道额,这里留下一个标记,以后研究研究)。

    接着,我们需要用上面写好的类来生成数据库了,这里我们要利用一个工具,叫EFCodeFrist,可以利用安装ASP.NET MVC 3时自带的NUGet管理器来搜索这个工具,然后点击安装,这当然是最方便的办法,可以一试,但是各种问题,各种安装不了,各种安装错误,很容易打击我们的学习积极性,所以安装不了,我们可以去Visual Studio Gallery下载,其实,只需要引用一个叫做Entity Framework的dll类库即可,如图

    ,这一步完成之后,我们要建立一个StudentInfoEntities的类,这个类要继承自DbContext,而DbContext类在System.Data.Entity命名空间下,该命名空间在没有引用EntityFramework.dll类库的前提下是无法using到的。我们安装EFCodeFirst工具,也就是为了在VS每次创建项目的时候能自动的引用这个dll。

    StudentInfoEntities类中的代码如下:

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    
    namespace CodeFirstDemo.Models
    {
        public class StudentInfoEntities : DbContext
        {
            public DbSet<Student> Students { get; set; }
    
            public DbSet<Course> Courses { get; set; }
    
            public DbSet<Score> Scores { get; set; }
        }
    }

    最后,我们在Web.Config里配置一下数据库的连接字符串,

      <connectionStrings>
        <add name="StudentInfoEntities" connectionString="Data Source=.SQLEXPRESS;Initial Catalog=StudentInfo;Integrated Security=True" providerName="System.Data.SqlClient"/>
      </connectionStrings>

    注意,name属性的值必须与继承自DbContext的类名一致,这样EntityFramework在web.config里才能找到正确的连接字符串,从而访问数据库。如果不写连接字符串,或者name的值不同,EF也会尝试连接本地的数据库,不过生成的数据库名,会是项目名.Models.StudentInfoEntities,一切取决于您了。

    一切配置完成之后,就开始运行程序了,显然,当我们点击调试按钮之后,什么都没有发生。。。因为,我们需要一个触发条件,就是写一段读取数据库的代码,这样,EF会根据web.config的连接来读取数据库,如果发现数据库中没有,才会自动创建它,如果已存在,则读取里面的数据并返回。

    新建一个HomeController,在Index方法中加入代码:

    View Code
    namespace CodeFirstDemo.Controllers
    {
        public class HomeController : Controller
        {
            private StudentInfoEntities db = new StudentInfoEntities();
    
            public string Index()
            {
                var data = db.Students.ToList();
                return "Database is build success!";
            }
    
        }
    }

    这样,再运行一个程序,当界面显示出字符的时候,去数据库看一下,数据库是不是自动生成了呢?

    同时,您会发现,在Score表中,自动产生外键关系,是不是很方便呢。



    原文链接:http://www.cnblogs.com/Alex-bg/archive/2012/10/20/2732300.html

  • 相关阅读:
    JS判断数组中是否有重复元素的方法
    根据类名找到元素
    JS获取页面元素并修改
    JS实现会动的小车
    动态规划------最长公共子串(连续)
    动态规划------最长递增子序列
    买卖股票的最佳时期
    操作系统清华大学版笔记(十一)死锁、银行家算法和进程间通信(直接通信、间接通信)
    128 最长连续序列
    链表------删除有序单链表中重复的节点
  • 原文地址:https://www.cnblogs.com/Percy_Lee/p/5109502.html
Copyright © 2011-2022 走看看