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. IE8/IE9无法启用JavaScript怎么办

    在IE8/IE9 中,有些同学在浏览网页时,收到提示:“需要启用 JavaScript …”,并且会发现网页上某些功能不能用了,比如点击网页里的按钮没反应等等.这个是因为浏览器的JavaScript ...

  2. ZOJ 3820 Building Fire Stations

    题意: 树上找两个点  使得其它点到这两点随意一点的距离的最大值最小 思路: 最大值最小  想到二分  在二分的基础上判定这个最大值是否可能 怎样判定这个问题就是怎样选那两个点的问题  非常明显  我 ...

  3. 一张漫画说尽IT开发过程

  4. String.Format in Java and C#

    原文:String.Format in Java and C# JDK1.5中,String类新增了一个很有用的静态方法String.format(): format(Locale l, String ...

  5. printf那点事

    1.打印内存地址 #include<stdio.h> int main() { int a; printf("%p\n",&a); //%p打印地址,自己主动加 ...

  6. UVa 10285 - Longest Run on a Snowboard

    称号:给你一个二维矩阵,找到一个点.每一个可以移动到的位置相邻的上下,求最长单调路径. 分析:贪婪,dp.搜索. 这个问题是一个小样本,我们该怎么办. 这里使用贪心算法: 首先.将全部点依照权值排序( ...

  7. CI框架学习笔记

    打印SQL语句$this->dbRead->last_query(); 重映射方法正如上文所说,URI 的第二段通常决定控制器的哪个方法被调用.CodeIgniter 允许你使用 _rem ...

  8. Power Strings (poj 2406 KMP)

    Language: Default Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33205   ...

  9. 专业的GIS(电子地图、地理信息系统)在房地产行业的初步应用?

    时下随着智能手机在我国的迅猛发展以及网络时代的快速前进.手机APP以及web应用站点也顺势发展的如火如荼.我们国家还是一个人口大国,在吃穿不愁的今天,一个人口大国必需要面对的严峻问题就是住房问题.即使 ...

  10. android download学习记录

    东西拼凑,最终弄出来能够用的代码 [1].[代码] [Java]代码 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...