关闭

玩转ASP.NET 5:初始化数据库

发表于:2015-1-27 11:16

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:GiveCase    来源:51Testing软件测试网采编

  1.初始化数据库
  1.2目录
  这不是专述模式/架构设计的帖子,架构搭建以讲解文章为目的,先不过多分层。
  截这个图也是便于你对应下面找代码文件路径!
  1.2代码
  先控制台应用程序来演示。(比较蛋疼,MS针对ASP.NET 5测试框架在beta1版中,可用XUnit.KRunner。beta2中我也不知道用那个?)
  不管你用不用EF?传统做法先设计数据库,但写代码面向对象开发时还是要设计实体(模型),为了方便映射实体的属性和数据库字段是一一对应(也可以通过Fluent API配置,实体属性设计和字段不对应)。实体可以当作业务对象,视图模型,传输对象。但根据需要这些对象或模型属性不一定和数据库字段一致,可以另外定义。
  我们先设计一个实体基类(还是那句话,仅供讲解,代码不全或不严谨,理解万岁啦!):
using System.ComponentModel.DataAnnotations;
namespace BlogASPNET5.Entity.Bases
{
/// <summary>
/// 实体基类
/// </summary>
/// <typeparam name="T">主键类型</typeparam>
public class EntityBase<T>
{
[Key]
public T Id { get; set; }
//记录创建时间
//是否删除
//行版本
}
}
  注:EF对于主键类型为整型和Guid类型,其属性为Id或类名+Id(不分大小写),可以不用标注Key;整型便于阅读;Guid便于数据合并;也可以字符串。所以这里用到泛型,继承时再决定什么类型。
  下面再定义Account相关的角色实体:
using BlogASPNET5.Entity.Bases;
using System.Collections.Generic;
namespace BlogASPNET5.Entity.Accounts
{
/// <summary>
/// 角色实体
/// </summary>
public class Role :EntityBase<int>
{
public string Name { get; set; }
public string Description { get; set; }
/// <summary>
/// 导航属性  (后面演示Redis时,不要导航属性)
/// </summary>
public ICollection<User> Users { get; set; }
}
}
Account相关的用户实体:
using BlogASPNET5.Entity.Bases;
namespace BlogASPNET5.Entity.Accounts
{
public class User : EntityBase<int>
{
public string Name { get; set; }
public string Password { get; set; }
public Gender Gender { get; set; }
/// <summary>
/// 角色Id 外键
/// </summary>
public int RoleId { get; set; }
/// <summary>
/// 导航属性
/// </summary>
public Role Role { get; set; }
}
/// <summary>
/// 性别 枚举类型
/// </summary>
public enum Gender { man, woman }
}
  注:EF7又不支持复杂类型(其实通过继承即可),但枚举类型支持保留;(后面使用Redis,导航属性就没用了)。
  既然要用EF来创建数据库及初始化数据,需要EF操作上下文类:
using BlogASPNET5.Entity.Accounts;
using Microsoft.Data.Entity;
using Microsoft.Data.Entity.Metadata;
namespace BlogASPNET5.Repository.Contexts
{
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=TestDB;UID=sa;PWD=123456;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//多对一关系及指定外键
modelBuilder.Entity<User>().ManyToOne(r => r.Role, u => u.Users).ForeignKey(f => f.RoleId);
}
}
}
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号