第06章 ASP.NET 5:EntityFramework7

1.前言

上一篇文中扯的是EF6下的实体关系设计及迁移,预留的问题也不再补充了。原因写此系列文章,其初衷是针对ASP.NET 5介绍的,EF6又不支持它的,略过也罢。

EF的性能是永远抛不开的话题,园子里的师傅们也一直争论不休。(每次看到此类帖,点击量老高了)

不知道大家是否明白:什么是平台?什么是框架?什么是类库?我在此也可能说的不对,也望你纠正。

EF显然不是什么平台,因为不能只依赖它来开发或运行一个什么应用。

哪它是框架吗?说到这,还是得解释一下何谓框架?简单地说它规定或规则好一些架子,你要在此基础上做功能,需要再写一些代码。显然EF是一个框架。

那么说,什么是类库?你可理解为它是已经写好的代码,你拿来引用即可使其方法,一般不需要再修改其代码。

对平台的认知不会有什么歧义的,框架和类库到底如何区分?要不,这样看吧。假如两种框架在一起,一般不好一起使用,而多种类库一起就不会有冲突。

EF有一个生成SQL语句过程和实体状态跟踪,略有性能损失,哪就想想这个影响是否别的方式改进?比如:生成sql语句能不能缓存起来?是否使用数据缓存?……

如果你用不好EF做CRUD的话,你可以拿它只做生成表(不管怎样,你要面向对象开发,总是得编写实体类),也是一套方便的“工具”。

总之,EF是基于ADO.NET封装的框架,在此基础上发挥自己编码水平,或许更为关键。

 2.特点

EF7又有什么爽的地方?它目前还处于beta版阶段,资料甚少。如果你阅码水平高,看源码https://github.com/aspnet/EntityFramework是最好的。

EF7原生支持sqlserver(关系型数据库)及sqllite(嵌入式数据库),对Redis(NoSql数据库)也将得到支持,对InMemory(便于测试的内存数据库)支持;

EF7映射方式Only Code Frist,也就是不再支持Database Frist及Model Frist;

思考:EF7能否跨平台?支持任意项目类型?请大家想了,这里我们只演示ASP.NET 5项目中使用。既然ASP.NET 5可以跨平台了,EF7跟着走,你懂滴!

3.创建项目

同样为了演示,创建一个ASP.NET 5类型的WebApi项目:

 4.实体类

EntityBase.cs代码:

using System;
using System.ComponentModel.DataAnnotations;

namespace GiveCase.EntityFrameworks.Models
{
    /// <summary>
    /// 实体基类
    /// </summary>
    /// <typeparam name="TKey">主键类型</typeparam>
    public abstract class EntityBase<TKey>
    {
        /// <summary>
        /// 主键Id (主键类型根据继承时确定)
        /// </summary>
        public TKey Id { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; } = DateTime.Now;

        /// <summary>
        /// 是否删除  (逻辑删除而非物理删除)
        /// </summary>
        public bool IsDelete { get; set; } = false;

        /// <summary>
        /// 行版本 (时间戳处理并发)
        /// </summary>
        [Timestamp]
        public byte[] RowVersion { get; set; }
    }
}

Role.cs代码:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace GiveCase.EntityFrameworks.Models
{
    /// <summary>
    /// 角色实体
    /// </summary>
    public class Role : EntityBase<int>
    {
        /// <summary>
        /// 角色名称
        /// </summary>
        [Required(ErrorMessage = "不能为空")]
        public string RoleName { get; set; }

        /// <summary>
        /// 描述
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// 用户实体集合 (导航属性)
        /// </summary>
        public ICollection<User> Users { get; set; }
    }
}

User.cs代码:

using System.ComponentModel.DataAnnotations;

namespace GiveCase.EntityFrameworks.Models
{
    /// <summary>
    /// 用户实体
    /// </summary>
    public class User : EntityBase<int>
    {
        /// <summary>
        /// 用户名
        /// </summary>
        [StringLength(24, MinimumLength = 6, ErrorMessage = "字符长度必须6-24之间")]
        public string UserName { get; set; }

        /// <summary>
        /// 密码
        /// </summary>
        [StringLength(32, MinimumLength = 6, ErrorMessage = "字符长度必须6-32之间")]
        public string Password { get; set; }

        /// <summary>
        /// 性别
        /// </summary>
        public Sex Sex { get; set; } = Sex.secret;

        /// <summary>
        /// 邮箱
        /// </summary>
        [EmailAddress(ErrorMessage = "必须符合电子邮件地址格式")]
        public string Email { get; set; }

        /// <summary>
        /// 角色Id (外键)
        /// </summary>
        public int RoleId { get; set; }
        /// <summary>
        /// 角色实体 (导航属性)
        /// </summary>
        public Role Role { get; set; }
    }

    /// <summary>
    /// 性别 (枚举类型)
    /// </summary>
    public enum Sex { man, woman, secret }
}

5.配置

打开project.json

注:commands是迁移用的!

6.数据库上下文

EFContext.cs代码:

using Microsoft.Data.Entity;

namespace GiveCase.EntityFrameworks.Models
{
    public class EFContext :DbContext
    {
        public DbSet<Role> Roles { get; set; }
        public DbSet<User> Users { get; set; }

        protected override void OnConfiguring(DbContextOptions options)
        {
            options.UseSqlServer("Server=.; Database=EFTestDB;UID=sa;PWD=123456");
        }
    }
}

注:数据库连接字符串可以通过读取配置文件获取,参见“第03章”!

7.迁移

进入项目目录 (下面操作在系统DOS下也可以,这在“第02章”说过):

启用ef commands:

添加迁移:

同意迁移(更新到数据库):

查看数据表关系图:

OK!说明迁移成功!

8.小结

加晚班后,抽空写了这篇文章。只是演示了EF7迁移,别的知识已经没精力扯了,下次补啦!

时间: 2024-12-21 10:27:55

第06章 ASP.NET 5:EntityFramework7的相关文章

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第06章 | 抽象

第06章  抽象 ------ 懒惰即美德 假如要计算斐波那契数列(任何一个数是前两数之和的数字序列) >>> fibs=[0,1] >>> for i in range(8): fibs.append(fibs[-2]+fibs[-1]) #fibs[-2]+fibs[-1]后两位数,append往后添加 #运行后,包含10个斐波那契数列的10个数字是 >>> fibs [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 如果允许用户

第06章-图像处理及可视化(1)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本节对应原书中的第119页至第125页] 第6章图像处理及可视化 图像数据,如图6-1所示,在

《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架,它支持3种不同的技术来创建websites(网站)和Web应用:他们分别是,Web Pages,Web Forms,和MVC.虽然MVC是一种非常流行的,有完整的用于软件开发模式理论的技术,但它在ASP.NET中却是一种新的技术. 目前最新的版本是2012年发布的ASP.NET MVC4.自从2008年发布

第06章-图像处理及可视化(2)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本节对应原书中的第125页至第138页] 6.5图像源 VTK中有些图像处理对象本身并不接收任

第02章 ASP.NET 5 :KRE(CLR)-KVM-KPM-K Commands

1.引子 如题:ASP.NET 5是什么?KRE(CLR)为啥多版本了?KVM是来干神马的?KPM又做什么?K Commands又来晕啥?……哎!其实我也是稀里糊涂的,如有个人之见不对之处,还望你拍拍键盘留言指正! 2.ASP.NET 5 微软在2013年底接触和支持Xamarin后,这算是开源社区力量和呼声吧!在2014年微软终于决定开展跨平台及开源战略,这才出现了ASP.NET vNext,先从web应用开始,但到底走向如何?到达何种程度?开源简单,一句话的事,跨平台就难办了,这工作量可大着

第16章 ASP.NET MVC 日志篇

本章主要介绍MVC中内置的错误处理.日志以及用来提升性能的监控工具 一.错误处理     当该网站忙于处理HTTP请求时,很多内容都会出错.幸运的是,MVC让错误处理工作变得相对简单了很多,因为MVC应用是运行在MVC框架之上的,所以可以访问底层框架的核心功能,包括自定义错误处理页面及显示错误状态码. 其中处理错误有三种基本的方法: (1)第一种:配置<customErrors/>节点 也是最简单的一种,即启用MVC自定义错误处理特性:就是在web.config文件中配置<customE

第04章 ASP.NET 5 :WebApi及Fiddler工具

1.概述 曾经有人问:asp.net mvc和asp.net webapi区别在哪?这个其实不好回答的.可能因为mvc模式盛行的原因,webapi显得孤芳自赏了,让人觉得它是鸡肋.其实webapi应该比mvc更符合web应用与开发本质,功能也不弱于mvc. mvc4和5出现时,才有webapi出现,至于它为何出现?我们没有必要研究这些,能玩好它就行了.这时的webapi和mvc的最大区别是路由管道不一致,各实现自己的一套.到了mvc6时代,微软也意识到,代码基本差不多,何不重用?所以,现在mvc

第06章 字符串的处理

第6章 字符串的处理 字符串属于类.在Java语言中,处理文本主要应用的类是"String"类和"StringBuffer"类.处理小型文本,使用"String"类.处理大型文本,使用"StringBuffer"类. public class str{ public static void main(String[] args){ String str = new String(); //构造函数 str = "He

第一章ASP.NET SignalR简介

1.1概述: ASP.NET SignalR是微软新开发的类库,为的是帮助ASP.NET开发人员很方便地开发实时网络功能. SignalR允许服务器端和客户端之间进行双向通信.服务器端现在可以连接到客户端并且把内容瞬间推送出去,而不是一个客户端不断请求服务器端从而才能获取新数据(不是通过轮询去拉服务器端数据,而是服务器端主动推送数据到客户端).SignalR支持Web Sockets套接字,并且当使用旧版浏览器的时候会自动使用相关兼容的技术.SignalR包括它的API接口,用于连接管理的解耦(