一个简单的NetCore项目:1 - 搭建框架,生成数据库
1- 启动项目
安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了。简单粗暴的方式就是安装最新的VS2015.
2-搭建框架
2.1 打开VS新建一个项目,在弹出的新建项目对话框中,选中NET CORE选项,右边出现的选项就是.NET CORE的所有可建项目了。然后和创建传统.NET项目一样的创建项目就行了。
PS:不理解的可以参考 园子里面翻译小组的文章
2.2 开始编写领域实体对象。这里是先实现一个简单的权限管理。所以现在GR.Core 类库中创建一个domain文件夹,然后分别创建 User,Role,Menu实体,以及一个实体基类。
2.2.1 User 实体类:暂时只有用户名/密码/是否激活字段 (由于使用的是一个用户有多个角色的思路,因此多了一个List<UserRole> 导航属性,所以实体都是继承自baseEntity)
- public class User : BaseEntity
- {
- public string UserName { get; set; }
- public string Password { get; set; }
- public bool IsActived { get; set; }
- public List<UserRole> UserRoles { get; set; }
- }
User实体类
2.2.2 Role 实体类:
- public class Role : BaseEntity
- {
- public string RoleName { get; set; }
- public bool IsActived { get; set; }
- }
Role实体
2.2.3 Menu实体类:因为用的MVC 所以我没有使用URL那个字段,而是用areaname,contollername,actionname着三个字段,我想实现的是可以直接通过actionname去判断该用户是否用增删改查的权限。暂时没有想的很细,所以后续可能会改动。
- public class Menu : BaseEntity
- {
- public int? ParentId { get; set; }
- public string MenuName { get; set; }
- public string AreaName { get; set; }
- public string ControllerName { get; set; }
- public string ActionName { get; set; }
- public bool IsActived { get; set; }
- public Menu Parent { get; set; }
- public List<Menu> Children { get; set; }
- public List<MenuRole> MenuRoles { get; set; }
- }
Menu
2.2.4 UserRole,MenuRole实体:由于没有了map(m=>{}) 这个直接映射中间表的API,所以我们需要创建中间实体,来生成数据库中间表。
- public class UserRole
- {
- public int UserId { get; set; }
- public int RoleId { get; set; }
- public User User { get; set; }
- public Role Role { get; set; }
- }
UserRole实体
- public class MenuRole
- {
- public int MenuId { get; set; }
- public int RoleId { get; set; }
- public Menu Menu { get; set; }
- public Role Role { get; set; }
- }
MenuRole实体
2.2.5 小结
到此关于权限相关的实体类都创建完成了。接下来我们需要做的就是开始映射,然后生成数据库。
2.3 实体映射并生成数据库
2.3.1 在GR.Data的project.json文件中添加GR.Core项目引用,以及entityframecore的相关引用
2.3.2 创建Mapping文件夹,然后创建各个实体映射。
fluent api EntityTypeConfiguration<XXX> 已经取消了,改成使用ModelBuilder来做实体映射,映射函数名称都一样,就是移除了多对多关系的映射(所以前面创建实体类的时候有说需要创建中间实体类)。
- public class MenuMap
- {
- public static void Map(ModelBuilder modelBuilder)
- {
- //表映射
- modelBuilder.Entity<Menu>().ToTable("Menu");
- //主键映射
- modelBuilder.Entity<Menu>().HasKey(t => t.Id).HasName("PK_MENU_ID");
- //列映射
- modelBuilder.Entity<Menu>().Property(t => t.Id).HasColumnName("Id");
- modelBuilder.Entity<Menu>().Property(t => t.ParentId).HasColumnName("ParentId");
- modelBuilder.Entity<Menu>().Property(t => t.MenuName).IsRequired().HasColumnName("MenuName").HasColumnType("nvarchar(100)");
- modelBuilder.Entity<Menu>().Property(t => t.AreaName).HasColumnName("AreaName").HasColumnType("nvarchar(100)");
- modelBuilder.Entity<Menu>().Property(t => t.ControllerName).HasColumnName("ControllerName").HasColumnType("nvarchar(100)");
- modelBuilder.Entity<Menu>().Property(t => t.ActionName).HasColumnName("ActionName").HasColumnType("nvarchar(500)");
- modelBuilder.Entity<Menu>().Property(t => t.IsActived).HasColumnName("IsActived");
- //关系映射
- modelBuilder.Entity<Menu>()
- .HasOne(t => t.Parent)
- .WithMany(t => t.Children)
- .HasForeignKey(t => t.ParentId)
- .HasConstraintName("FK_PARENT_CHILDREN_PARENTID");
- }
- }
menumap实体映射
modelBuilder.Entity<Menu>().HasKey(t => t.Id).HasName("PK_MENU_ID"); 这里的hasname表示可以自定义主键的名称
- public class MenuRoleMap
- {
- public static void Map(ModelBuilder modelBuilder)
- {
- //表映射
- modelBuilder.Entity<MenuRole>().ToTable("MenuRoleMapping");
- //主键映射
- modelBuilder.Entity<MenuRole>().HasKey(t => new { t.RoleId, t.MenuId }).HasName("PK_MENU_ROLE_MENUROLEID");
- //列映射
- modelBuilder.Entity<MenuRole>().Property(t => t.RoleId).HasColumnName("RoleId");
- modelBuilder.Entity<MenuRole>().Property(t => t.MenuId).HasColumnName("MenuId");
- //关系映射
- modelBuilder.Entity<MenuRole>().HasOne(t => t.Menu).WithMany(t => t.MenuRoles).HasForeignKey(t => t.MenuId).HasConstraintName("FK_MENU_ROLE_MENUID");
- }
- }
menurolemap实体映射
其他的实体类映射方式都一样
2.3.3 接下来我们来创建一个 Dbcontext类
- using System;
- using GR.Core.Domain;
- using GR.Core.Domain.Menus;
- using GR.Core.Domain.Roles;
- using GR.Core.Domain.Users;
- using GR.Data.Mapping.Menus;
- using GR.Data.Mapping.Roles;
- using GR.Data.Mapping.Users;
- using Microsoft.EntityFrameworkCore;
- namespace GR.Data
- {
- /// <summary>
- /// 数据库链接上下文
- /// </summary>
- public class GRDbContext : DbContext
- {
- //public GRDbContext(DbContextOptions options) : base(options)
- //{
- //}
- //protected GRDbContext() : base()
- //{
- //}
- public DbSet<User> Users { get; set; }
- public DbSet<Role> Roles { get; set; }
- public DbSet<Menu> Menus { get; set; }
- public DbSet<UserRole> UserRoles { get; set; }
- public DbSet<MenuRole> MenuRoles { get; set; }
- protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
- {
- optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=NetCoreDb;Integrated Security=False;Persist Security Info=False;User ID=sa;Password=Passw0rd");
- base.OnConfiguring(optionsBuilder);
- }
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- TableMap(modelBuilder);
- //
- base.OnModelCreating(modelBuilder);
- }
- /// <summary>
- /// 表结构映射
- /// </summary>
- /// <param name="modelBuilder"></param>
- protected void TableMap(ModelBuilder modelBuilder)
- {
- UserMap.Map(modelBuilder);
- RoleMap.Map(modelBuilder);
- MenuMap.Map(modelBuilder);
- UserRoleMap.Map(modelBuilder);
- MenuRoleMap.Map(modelBuilder);
- }
- /// <summary>
- /// Get DbSet
- /// </summary>
- /// <typeparam name="TEntity">Entity type</typeparam>
- /// <returns>DbSet</returns>
- public new DbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity
- {
- return base.Set<TEntity>();
- }
- }
- }
GRDbContext数据库上下文
optionsbuilder.UserSqlServer:这个是创建数据库连接函数,这个可以在web项目中的startup类中就行配置。
在startup中配置,需要提供 public GRDbContext(DbContextOptions options) : base(options) 这个构造函数
2.3.4 下面我们就可以开始 生成数据库了
打开 nuget控制台,默认项目选择GR.Data,因为NETCORE已经取消了enable-migration,因此我们直接输入Add-Migration CreateInit 命令就可以了,然后使用update-database命令就可以生成数据库了。当你觉得Add-Migration生成的文件有问题或者不需要可以使用remove-Migration 命令删除该文件
3-小结
到此 搭建框架,生成数据库 的工作就完成了,明天我们将实现UI框架搭建以及登录功能。
PS:项目已经开源在Github,不过没有完成,后续将慢慢完善,欢迎大家提建议。
一个简单的NetCore项目:1 - 搭建框架,生成数据库的更多相关文章
- 一个简单的NetCore项目:2 - 登录
1-UI,登陆界面布局 PS:使用的是metronic 框架,没有用过的可以自行百度. 1.1 metronic 放在wwwroot文件夹下面 1.2 metronic 中的 open sans 使 ...
- 一个简单的java项目使用hibernate连接mysql数据库
实体类与表对应文件Customer.hbm.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTY ...
- 搭建Vue.js环境,建立一个简单的Vue项目
基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...
- 一个简单的JUnit项目
本人一直很喜欢JAVA,可是真正接触到JUnit也不过半年.由于公司进行网页测试,采用的是 JUnit+selenium的方式搭建的测试框架,然后采用JAVA语言编写,所以本人也好好研究了一下JUni ...
- Django入门第一步:构建一个简单的Django项目
Django入门第一步:构建一个简单的Django项目 1.简介 Django是一个功能完备的Python Web框架,可用于构建复杂的Web应用程序.在本文中,将通过示例跳入并学习Django.您将 ...
- 实现一个简单的侧边导航Winform程序框架
目录 简介 实现导航面板 实现方法 使用方法 实现标题栏 窗体拖拽及最大化 自定义窗体按钮 标题显示 按钮设置 实现状态栏 整体使用 参考文章 简介 每次新项目都要想着界面怎么设计好,但想来想去上位机 ...
- 手把手制作一个简单的IDEA插件(环境搭建Demo篇)
新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...
- 通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)
Hibernate的主要功能及用法: Ⅰ.Hibernate封装了JDBC,使Java程序员能够以面向对象的思想对数据库进行操作 Ⅱ.Hibernate可以应用于EJB的J2EE架构,完成数据的持久化 ...
- 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
一个简单的执行程序的GNU automake自动生成Makefile的方法及案例 在GNU的世界里,存在Automake这样的工具进行自动生成Makefile文件,automake是由Perl语言编写 ...
随机推荐
- oracle-03 表的管理
一.表名和列名的命名规则1).必须以字母开头2).长度不能超过30个字符3).不能使用oracle的保留字4).只能使用如下字符 a-z,a-z,0-9,$,#等 二.数据类型1).字符类char 长 ...
- 以ZMQ为基础的通信模型
最近使用了一下ZMQ的java版本,先不评述其它,网上已经有很多内容了. 我通过ZMQ的模式,在MsgClient,MsgServer中封装了基础ZMQ的使用.以此扩展了使用模型: 主要是基于2类分布 ...
- vue入门:实现图片点击切换
1.实现功能 2.目录结构 3.代码 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Linux基础 ppt pptx
引言 以前写过一个讲 Linux 基础的ppt,琢磨着把它分享出来,有需要的请自取. 部分截图如下 下载地址 下载地址1
- ETO的公开赛T1《矿脉开采》题解(另类版)
这道题别看是签到题,写起来一点不简单 出题人的正解是双向搜索 我们把物品分成两半 每一半分别跑搜索 答案存下来,用个双指针合并即可 然后我构造了两组数据卡掉了他,不得不缩小数据范围 但我这里为什么要致 ...
- Django url处理
Django如何处理一个请求当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码遵循的算法:1:Django 决定要使用的根URLconf 模块.通常,这 ...
- 前行记录 - NOIP2018游记
NOIP2018游记 - 前行记录 NOIP2018 完跪……滚回学校考半期 QwQ 这篇不是题解 awa ,题解之后会发布的,毕竟我还没有AC呢 又及……G2020 陌路笙歌 - 再见(╯▽╰) 感 ...
- 【前行】◇第3站◇ 国庆训练营·OI制模拟赛
[第3站] 国庆训练营·OI制模拟赛Ⅰ 怀着冲刺提高组400的愿望来到这个very small but very interesting 的训练营QwQ 在北大dalao的带领下开始了第一场OI模拟赛 ...
- ABAP术语-Application
Application 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/15/995737.html Set of work processe ...
- numpy的总结
一:基础篇 1)数值 import numpy as np np.set_printoptions(linewidth=200,suppress=True) a = np.array([1,2,3,4 ...