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