ASP.NET 5:初始化数据库

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);
}
}
}

定义初始化数据库方法:

using BlogASPNET5.Entity.Accounts;
using BlogASPNET5.Repository.Contexts;
using System.Linq; namespace BlogASPNET5.Repository.Migrations
{
public static class SampleData
{
static EFContext db = new EFContext(); public static void SetData()
{
db.Database.EnsureDeleted();
db.Database.EnsureCreated(); db.Add(
new Role { Name = "manage", Description = "管理员" },
new Role { Name = "member", Description = "会员" });
db.SaveChanges(); //嘛蛋,CoreCLR没随机函数,循环啦
for (int i = 1; i <= 1000; i++)
{
db.Add(
new User
{
Name = "admin" + i,
Password = "abc" + i,
Gender = Gender.man,
Role = db.Roles.Single(r => r.Name == "manage")
});
db.SaveChanges();
} for (int i = 1; i <= 1000; i++)
{
db.Add(
new User
{
Name = "member" + i,
Password = "efg" + i,
Gender = Gender.woman,
Role = db.Roles.Single(r => r.Name == "member")
});
db.SaveChanges();
}
}
}
}
  • 1.3调用

在控制台程序调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using BlogASPNET5.Repository.Contexts;
using BlogASPNET5.Repository.Migrations;
using System;
 
namespace BlogASPNET5.ConsoleApp
{
    public class Program
    {
        public void Main(string[] args)
        {
 
            //初始化数据,创建完了注释掉    
            SampleData.SetData();
 
            Console.WriteLine("set data OK!");
            Console.ReadLine();
 
            using (var db = new EFContext())
            {
                var lists = db.Users;
                foreach (var item in lists)
                {
                    Console.WriteLine(item.Name);
                }
            }
            Console.ReadLine();
        }
    }
}

结果就不截图了。 EF7 beta2又一个改进:创建出来的表,不再有MigrationHistory(看着不爽)这个表了。

2.小结

本篇先初始化数据库,下一章数据操作封装及查询分页。

打个“小广告 ”!欢迎志同道合的园友,加入QQ群:290576772(加时注明博客园)

 
分类: ASP.NET5

ASP.NET 5:初始化数据库的更多相关文章

  1. 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库

    采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...

  2. ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 设置和初始化数据库 上一章节中我们已经设置和配置好了 EF ...

  3. ASP.NET CORE RAZOR :初始化数据库

    官方说法是:设定数据库种子https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/sql 应用背景:初次部署系统时,设定一 ...

  4. 【EF6学习笔记】(一)Code First 方式生成数据库及初始化数据库实际操作

    本篇参考原文地址: Creating an Entity Framework Data Model 说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整 ...

  5. EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作

    EF6 学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文地址: Creating an Entity Framework Data Model 说明:学习 ...

  6. ASP.NET操作ORACLE数据库之模糊查询

    ASP.NET操作ORACLE数据库之模糊查询 一.ASP.NET MVC利用OracleHelper辅助类操作ORACLE数据库 //连接Oracle数据库的连接字符串 string connect ...

  7. ASP.NET 连接MySQL数据库 详细步骤

    ASP.NET默认的数据库是MS SQL Server,微软的数据库产品.事实上,如果不计成本因素的话,Windows Server + IIS + MS SQL Server + ASP.NET是网 ...

  8. ASP.NET连接Oracle数据库的步骤详解(转)

    ASP.NET连接Oracle数据库的步骤详解   本文我们主要介绍了ASP.NET连接Oracle数据库的步骤及每个步骤需要进行的设置,希望能够对您有所帮助.   在用ASP.NET开发应用程序时, ...

  9. Entity FrameWork初始化数据库的四种策略

    程序猿就是苦逼,每天还得分出一些时间去写博文.天真的很热,今天就随便写一点啦! 1.EF初始化数据库的四中策略 EF可以根据项目中的模型自动创建数据库.下面我们就分类看看Entity Framewor ...

随机推荐

  1. Windows命令行命令集锦

    原文:Windows命令行命令集锦 转自:http://www.me2wg.com/bbs/forum.php?mod=viewthread&tid=15830 winver--------- ...

  2. C#-默认显示前列-ShinePans

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. SharePoint 2013 添加Ribbon菜单

    原文:SharePoint 2013 添加Ribbon菜单 前言:今天,我们尝试一下添加SharePoint2013的Ribbon菜单,这个Ribbon菜单是由XML定义,JavaScript脚本来实 ...

  4. 脚本+批处理打造IIS监控器

    原文 脚本+批处理打造IIS监控器 首先说下我什么要写它,第一.它可以帮你做一件事,那就是随时给你监控你公司的网站服务器的状态,一旦你的网站出现问题不能访问了,它就会自动帮你重启IIS然后让死掉的网站 ...

  5. Eclipse 4.4.2 取消空格键代码上屏

    基本是照这个站点来的: 点击打开链接 可是问题不止这些!! 从网上下了SDK, 然后打开之后首先发现没有plugins窗体, 好吧, 先通过Help -> Install New Softwar ...

  6. 《学习opencv》笔记——矩阵和图像处理——cvAnd、cvAndS、cvAvg and cvAvgSdv

    矩阵和图像的操作 (1)cvAnd函数 其结构 void cvAnd( //将src1和src2按像素点取"位与运算" const CvArr* src1,//第一个矩阵 cons ...

  7. JQUERY 选择

    jQuery 选择器 jQuery 采用 CSS 一个选择选择 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") 选取 ...

  8. 动手学习TCP:数据传输(转)

    前面的文章介绍了TCP状态变迁,以及TCP状态变迁图中的一些特殊状态. 本文主要看看TCP数据传输过程中需要了解的一些重要点: MSS(Maximum Segment Size) Seq号和Ack号的 ...

  9. MD5算法的原理与实现

    ***********************************************声明************************************************ 原创 ...

  10. php_json入库有关

    php入库json信息 有些字符需要特殊处理 //组装 $test=array(); $test["k1"]= urlencode($k1); $test["k2&quo ...