第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>
        1433843161
        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迁移,别的知识已经没精力扯了,下次补啦! 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。