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