详细步骤

  • 创建文件夹,规划好项目目录
  • 创建相关实体类 (Data Model)
  • 创建 Database Context
  • 创建Initializer, 使用EF初始化数据库,插入测试数据
  • 实现数据库登录验证
  • 总结

一,创建文件夹,规划好项目目录

  1.根目录下新建一个 ViewModels文件夹:

    Models文件夹里面存放对应于数据库表的实体;

    View中需要显示的数据和Models中实体模型不一定能对应上, 因此需要专门给View使用的自定义数据模型,

    我们称之为ViewModel , 放在   ViewModels文件夹里面。

  2.根目录下新建一个DAL 文件夹:

    DAL 放置数据访问相关类,如MyDbContext.cs, Initializer.cs

二,创建相关实体类 (Data Model)

  为了更加贴近真实情况,我们针对用户建立三个相关的类。 TbUser, TbRole, TbUserRole

    TbUser Entity

    public class TbUser
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public virtual ICollection<TbUserRole> TbUserRoles { get; set; }
}

    TbRole Entity

    public class TbRole
{
public int Id { get; set; }
public string RoleName { get; set; }
public string RoleDescription { get; set; }
public virtual ICollection<TbUserRole> TbUserRoles { get; set; }
}

    TbUserRole Entity

using System.ComponentModel.DataAnnotations.Schema;

namespace TestMVC.Models
{
public class TbUserRole
{
public int Id { get; set; }
public int UserId { get; set; }
public int RoleId { get; set; }
[ForeignKey("UserId")]
public virtual TbUser TbUser { get; set; }
[ForeignKey("RoleId")]
public virtual TbRole TbRole { get; set; }
}
}

  对于上面几个类的约定和说明:

  • EF生成数据库时,ID 属性将会成为主键。(约定:EF默认会将ID或classnameID生成主键, MSDN建议保持风格的一致性, 都用ID或classnameID, 我们这里都用ID);
  • EF 生成数据库时 , <navigation property name><primary key property name>这种形式的会成为外键. ( 约定 )

    例如外键 TbUserID = TbUser(navigation property)+ID(TbUser的主键) ;

  • 定义为virtual的几个属性是 navigation 属性(virtual非必须, 只是惯例用法);

    navigation 属性保存着其他的关联entity(entities);

    示例中, TbUser和TbUserRole是一对多的关系, TbRole和TbUserRole也是一对多的关系;

    如果是 "多", 属性类型就必须是List( 这里用的是ICollection);

三,创建 Database Context

  1.通过NuGet安装Entity Framework

  

  2.创建类 MyDbContext.cs , 让他继承自System.Data.Entity.DbContext, 我们用这个类完成EF的功能:

  主要做下面三件事:

    • 为每个entity set创建一个DbSet

      在EF中,通常情况下一个entity set对应数据库中的一张表,一个entity对应表中的一行。

    • 指定一个连接字符串

      构造函数中的 base("MyDbContext") 。

      默认情况下和类名一样,即MyDbContext我们显式的给他指定出来。

    • 指定单数形式的表名

      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

      默认情况下会生成复数形式的表,如TbUsers

      PS: 表名用单复数形式看各自的习惯,没有明确的规定。有的公司表名全用单数,有的公司根据表的意思,有单数也有复数。

  MyDbContext.cs

    public class MyDbContext:DbContext
{
public MyDbContext()
: base("MyDbContext")
{ }
public IDbSet<TbUser> TbUsers { get; set; }
public IDbSet<TbRole> TbRoles { get; set; }
public IDbSet<TbUserRole> TbUserRoles { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//因为表名称默认为复数形式,这里是移除复数形式,所以为单数形式生成
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}

  3.配合上面第2点,需要web.config中的数据库连接字符串:

  如下图,添加connectionStrings节点。注意要web.config中要加上红字部分(表示连接的是Sql Server数据库),不然会出错。

  <connectionStrings>
      <add name="MyDbContext" connectionString="Data Source=.;

   database=TestMvc;uid=sa;pwd=123456;AttachDBFilename=|DataDirectory|\TestMVC.mdf;" providerName="System.Data.SqlClient"/>
   </connectionStrings>

  PS: AttachDBFilename=|DataDirectory|\TestMVC.mdf设定了数据库文件的存放位置:在项目根目录的App_Data文件夹下

  

四,创建Initializer, 使用EF初始化数据库,插入测试数据

  PS:EF可以以多种方式建立数据库,我们暂时采用 第一次运行程序时新建数据库,插入测试数据; model改变(和database不一致)时删除重建数据库,插入测试数据。暂时不用管数据丢失的问题,直接drop and re-create比较方便。等后面单独拿一篇出来讲解生产环境中如何不丢失数据修改数据库。

  1.新建类Initializer.cs来完成这个工作:

   Seed方法用我们之前定义的database context(即MyDbContext) 作为参数,通过这个context将entities添加到database中去;

   从上面代码可以看出, Seed方法对每一个entity的类型;

   创建一个colletion à 添加到适当的 DbSet property à 保存到数据库。

  Initializer.cs

    public class Initializer:DropCreateDatabaseIfModelChanges<MyDbContext>
{
protected override void Seed(MyDbContext context)
{
var tbUsers = new List<TbUser> {
new TbUser{UserName="张三",Password="zhangsan",Email="zhangsan@163.com"},
new TbUser{UserName="李四",Password="lisi",Email="lisi@163.com"}
};
tbUsers.ForEach(u => context.TbUsers.Add(u)); var tbRoles = new List<TbRole> {
new TbRole{RoleName="管理员",RoleDescription="管理员具有最高权限来对系统进行管理"},
new TbRole{RoleName="一般用户",RoleDescription="一般用户具有一些基本的操作权限"}
};
tbRoles.ForEach(r => context.TbRoles.Add(r));
var tbUserRole = new List<TbUserRole> {
new TbUserRole{UserId=,RoleId=},
new TbUserRole{UserId=,RoleId=},
new TbUserRole{UserId=,RoleId=}
};
tbUserRole.ForEach(ur => context.TbUserRoles.Add(ur));
context.SaveChanges();
}
}

  2.修改web.config, 通知EF使用我们刚刚写好的Initializer类,找到entityFramework配置节,添加下图方框处内容:

  

   context 配置节中, type 的值对应 (context class的完整描述,程序集)

  databaseInitializer 配置节中 , type 的值对应 (initializer class 的完整描述,程序集)

  PS: 如果你不想EF使用某个context, 可以在context节点里面添加属性disableDatabaseInitialization="true";

五,实现数据库登录验证

  现在EF一切就绪了,运行程序,当第一次连接数据库时,EF比较model(AccountContext和entity classes) 和database. 如果两边不一致,程序将会drop and re-create(删除并新建)数据库,因为目前我们还没有连接数据库的操作,所以EF还没发挥作用。在第一次连接数据库时才会生效。

  AccountController.cs

    public class AccountController : Controller
{
private MyDbContext db = new MyDbContext();
// GET: Account
public ActionResult Index()
{
return View();
} public ActionResult Login()
{
ViewBag.LoginState = "登录前...";
return View();
}
[HttpPost]
public ActionResult Login(TbUser user)
{
var userinfo = db.TbUsers.FirstOrDefault(u => u.Email == user.Email && u.Password == user.Password);
if (userinfo != null)
ViewBag.LoginState = userinfo.UserName+"登录后...";
else
ViewBag.LoginState = user.Email + "用户不存在...";
return View();
}
}

  Login.cshtml

@model TestMVC.Models.TbUser
@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Login</title>
</head>
<body>
<div>
@ViewBag.LoginState
@using(Html.BeginForm("Login","Account",FormMethod.Post)){
@Html.LabelFor(u=>u.Email)<br />
@Html.TextBoxFor(u=>u.Email)<br />
@Html.LabelFor(u => u.Password)<br />
@Html.PasswordFor(u => u.Password)<br />
<input type="submit" value="登录" />
}
</div>
</body>
</html>

  然后运行Login.cshtml页面,执行效果下:

  

  

  

六,总结

OK,到此为止,我们搭建好了EF框架,进行了数据库的初始化,查询了一条用户信息。

需要说明的是,现在的登录功能还比较简陋,不是真正的登录功能(例如输入项还缺少验证,密码还没有加盐),只是为了说明EF的用法。

最后再回顾下本章的重点:掌握使用EF开发的整个过程。

创建Data Modelà创建Database Context à创建databaseInitializerà配置entityFramework的context配置节

  希望大家能清晰的了解上面整个过程,理解每一个过程的作用。

源码下载

MVC5+EF6入门教程——实现动态创建数据库与登录验证的更多相关文章

  1. ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用

    文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html 上一节:ASP.NET MVC ...

  2. ASP.NET MVC5 + EF6 入门教程 (5) Model和Entity Framework

    一.创建Model MVC中的Model是用来给View提供显示数据的对象. 这里我们首先创建一个Model对象. 在解决方案资源管理器中右键点击Models文件夹,选择添加->类.添加一个名为 ...

  3. MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

    稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...

  4. MVC5 + EF6 入门完整教程二

    从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛弃了WebForm的一些特有的习惯,例如服务器端控件,Vie ...

  5. MVC5+EF6 入门完整教程九

    前一阵子临时有事,这篇文章发布间隔比较长,我们先回顾下之前的内容,每篇文章用一句话总结重点. 文章一 MVC核心概念简介,一个基本MVC项目结构 文章二 通过开发一个最基本的登录界面,介绍了如何从Co ...

  6. MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用

    摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...

  7. MVC5+EF6 入门完整教程12--灵活控制Action权限

    大家久等了. 本篇专题主要讲述MVC中的权限方案. 权限控制是每个系统都必须解决的问题,也是园子里讨论最多的专题之一. 前面的系列文章中我们用到了 SysUser, SysRole, SysUserR ...

  8. MVC5 + EF6 入门完整教程1

    https://www.cnblogs.com/miro/p/4030622.html 第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定& ...

  9. MVC5+EF6 入门完整教程

    MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@20150521 MVC5+EF6 入门完整教程9:多表 ...

随机推荐

  1. Linux 之父自传《just for fun》读书笔记

    一次偶然的机会,看到了阮一峰老师关于这本书的介绍,当时我就觉得这本书相当有趣. 在没有读这本书之前,我觉得 linus 作为发明 Linux 系统的人,应该是一个比较严肃的人,就像我的老师一样.但事实 ...

  2. mysql数据库的基本操作:创建数据库、查看数据库、修改数据库、删除数据库

    本节相关: 创建数据库 查看数据库 修改数据库 删除数据库 首发时间:2018-02-13 20:47 修改: 2018-04-07:考虑到规范化,将所有语法中“关键字”变成大写;以及因为整理“mys ...

  3. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数

    反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  4. ERP按序打印问题

    按序打印只适合一个机器,不适合主副机模式,主副机模式请勾选同时打印 如果开启主副机模式勾选了按序打印,会造成副机下厨后厨不出单

  5. MHA快速搭建

    很早之前写过MHA的文章,但是常常在技术群看到有同学问MHA搭建的问题,不是权限问题就是配置问题,我在这里就再次一写下配置过程以及快速的搭建.如果想知道更多的细节与原理,请参考:MySQL高可用架构之 ...

  6. idea2018版tomcat基本配置

    前言 在配置tomcat之前,要先创建一个javaweb的工程 打开idea的主界面,在菜单中点击File,出现以下的图 点击选择 Application Server 点击选择 Tomcat Ser ...

  7. 更换jupyter notebook风格主题、修改默认工作路径(Ubuntu系统和Win系统)

    默认的风格对代码关键词的颜色提醒很不明显,而且白色背景长久使用非常刺眼,所以考虑更换主题. 在更换途中,发现代码输出行,前几个字符被遮挡显示不出来,找了很久才解决,备忘一些要点. 1:替换主题方法 h ...

  8. 【PAT】B1010 一元多项式求导

    这道题的用例中没有负数 在输入时就进行结果的计算,忽略常数项, 顺序输出 #include<cstdio> #include<vector> using namespace s ...

  9. VS2013 创建ASP.NET MVC 4.0 未指定的错误(异常来自HRESULT: 0x80004005(e_fail))

    这个错误是真的头疼,尝试各种办法都没用,最后解决用的方法是: 找到 vs_ultimate.exe 修复文件,我的文件位置在 C:\ProgramData\Package Cache\{4d78654 ...

  10. MapReduce过程详解及其性能优化

    http://blog.csdn.net/aijiudu/article/details/72353510 废话不说直接来一张图如下: 从JVM的角度看Map和Reduce Map阶段包括: 第一读数 ...