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 - 搭建框架,生成数据库的更多相关文章

  1. 一个简单的NetCore项目:2 - 登录

    1-UI,登陆界面布局 PS:使用的是metronic 框架,没有用过的可以自行百度. 1.1 metronic 放在wwwroot文件夹下面 1.2  metronic 中的 open sans 使 ...

  2. 一个简单的java项目使用hibernate连接mysql数据库

    实体类与表对应文件Customer.hbm.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTY ...

  3. 搭建Vue.js环境,建立一个简单的Vue项目

    基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...

  4. 一个简单的JUnit项目

    本人一直很喜欢JAVA,可是真正接触到JUnit也不过半年.由于公司进行网页测试,采用的是 JUnit+selenium的方式搭建的测试框架,然后采用JAVA语言编写,所以本人也好好研究了一下JUni ...

  5. Django入门第一步:构建一个简单的Django项目

    Django入门第一步:构建一个简单的Django项目 1.简介 Django是一个功能完备的Python Web框架,可用于构建复杂的Web应用程序.在本文中,将通过示例跳入并学习Django.您将 ...

  6. 实现一个简单的侧边导航Winform程序框架

    目录 简介 实现导航面板 实现方法 使用方法 实现标题栏 窗体拖拽及最大化 自定义窗体按钮 标题显示 按钮设置 实现状态栏 整体使用 参考文章 简介 每次新项目都要想着界面怎么设计好,但想来想去上位机 ...

  7. 手把手制作一个简单的IDEA插件(环境搭建Demo篇)

    新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...

  8. 通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)

    Hibernate的主要功能及用法: Ⅰ.Hibernate封装了JDBC,使Java程序员能够以面向对象的思想对数据库进行操作 Ⅱ.Hibernate可以应用于EJB的J2EE架构,完成数据的持久化 ...

  9. 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例

    一个简单的执行程序的GNU automake自动生成Makefile的方法及案例 在GNU的世界里,存在Automake这样的工具进行自动生成Makefile文件,automake是由Perl语言编写 ...

随机推荐

  1. session和cookie的介绍

    1.将cookie,session之前,还是先说说http协议 http协议是基于TCP/UDP之上的应用层一个标准 请求,响应的模式.是你必须先请求到一个服务端之后,服务端才会响应到你.他是不会无缘 ...

  2. Java程序如何生成Jar 执行文件(1)

    一.用Eclipse生产Jar文件 注意:此方法只能打包简单程序,不包含含有第三方jar包的项目 首先,看一下我的项目的目录结构: 1,项目名字上面点右键,选择Export,在选择java\JAR f ...

  3. 【MYSQL笔记3】MYSQL过程式数据库对象之存储过程的调用、删除和修改

    mysql从5.0版本开始支持存储过程.存储函数.触发器和事件功能的实现. 我们以一本书中的例题为例:创建xscj数据库的存储过程,判断两个输入的参数哪个更大.并调用该存储过程. (1)调用 首先,创 ...

  4. centos7 openvpn代理搭建

    系统环境:centos7.1 拨号ip地址:125.112.194.40(公网) server端部署 一.准备工作 1.检查SELinux状态,关闭 sed -i 's/enforcing/disab ...

  5. QP之QF原理

    1.QP简介: 量子平台(Quantum Platform, 简称QP)是一个用于实时嵌入式系统的软件框架,QP是轻量级的.开源的.基于层次式状态机的.事件驱动的平台. QP包括事件处理器(QEP). ...

  6. python 中 pynlpir错误 Cannot Open Configure file pynlpir\Data\Configure.xml 解决

    在用python做分词.数据处理的时候,想调用pynlpir库,pynlpir.open()时出现错误,更新一下授权文件还是错误, 仔细一看错误是:Cannot Open Configure file ...

  7. zabbix监控MySQL服务状态

    Mysql模板使用 在zabbix_agent配置文件中加入监控配置 vim etc/zabbix_agentd.conf ... UserParameter=mysql.version,mysqla ...

  8. python3 练习题100例 (二十八)打印一定范围内的素数

    题目内容: 给定一个大于2的正整数n,打印出小于n(不包括n且n不大于100)的所有素数. 要求将符合条件的输出填入一个列表中,打印的结果为该列表. 输入格式: 共一行,为一个大于2的正整数 输出格式 ...

  9. python学习之面向对象程序设计的一些思考

    将属于一类的对象放在一起: 如果一个函数操纵一个全局变量,那么两者最好都在类内作为特性和方法实现. 不要让对象过于亲密: 方法应该只关心自己实例的特性,让其他实例管理自己的状态. 简单就好: 让方法小 ...

  10. IO复用——epoll系列系统调用

    1.内核事件表 epoll是Linux特有的I/O复用函数.epoll把用户关心的文件描述上的事件放在内核里的一个事件表中,并用一个额外的文件描述符来标识该内核事件表.这个额外文件描述符使用函数epo ...