1实体
1.1 Core.Domain.BaseEntity
namespace Core.Domain
{
/// <summary>
/// 【基实体--类】
/// <remarks>
/// 摘要:
/// 1、所有的具体实现实体通过继承该抽象实体,以获取相应的的长整型编号值。
/// 2、为所有的具体实现实体的反射/依赖注入实例化操作,提供1个通用的抓手。
/// </remarks>
/// </summary>
public abstract class BaseEntity
{
/// <summary>
/// 【编号】
/// <remarks>
/// 摘要:
/// 获取/设置所有实体实例的长整型编号值。
/// </remarks>
/// </summary>
public long Id { get; set; }
}
}
1.2 Core.Domain.ILogicDeletedEntity
namespace Core.Domain
{
/// <summary>
/// 【逻辑删除实体--接口】
/// <remarks>
/// 摘要:
/// 1、继承于该接口的所有的具体实现实体,都需要实现逻辑删除功能。
/// 2、为所有的具体实现实体的反射/依赖注入实例化操作,提供1个通用的抓手,这些实例都具有逻辑删除功能。
/// </remarks>
/// </summary>
public interface ILogicDeletedEntity
{
/// <summary>
/// 【(逻辑)删除?】
/// <remarks>
/// 摘要:
/// 获取/设置1个值false(未(逻辑)删除)/true(已经(逻辑)删除),该值指示1指定实体的1个指定实例是否已经处于(逻辑)删除状态。
/// </remarks>
/// </summary>
bool Deleted { get; set; }
}
}
1.3 Core.Domain.Role
//项目
using Core.Domain.Security;
namespace Core.Domain.Users
{
/// <summary>
/// 【角色--类】
/// <remarks>
/// 摘要:
/// 通过该实体类及其属性成员,用于实现当前程序【Core】.【领域】.【用户集】.【角色】实体与“[ShopDemo].[Role]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public class Role : BaseEntity
{
#region 属性
/// <summary>
/// 【角色名】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定的角色名。
/// </remarks>
/// </summary>
public string Name { get; set; }
/// <summary>
/// 【启用?】
/// <remarks>
/// 摘要:
/// 获取/设置1个值false(禁用)/true(默认值:启用),该值指示角色实体的1个指定实例是否处于启用状态。
/// </remarks>
/// </summary>
public bool IsActive { get; set; }
/// <summary>
/// 【备注】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定角色的备注信息。
/// </remarks>
/// </summary>
public string Remark { get; set; }
#endregion
#region 属性--映射和级联构建
/// <summary>
/// 【权限角色映射集】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定角色实例所对应的所有权限角色映射实例。
/// 说明:
/// 构建权限与角色实体及其表之间的n:n映射关系,但在实现和逻辑定义实现上二者是平等关系。
/// </remarks>
/// </summary>
public virtual ICollection<PermissionRole> PermissionRoleCollection { get; set; }
#endregion
}
}
1.4 Core.Domain.User
namespace Core.Domain.Users
{
/// <summary>
/// 【用户--类】
/// <remarks>
/// 摘要:
/// 通过该实体类及其属性成员,用于实现当前程序【Core】.【领域】.【用户集】.【用户】实体与“[ShopDemo].[User]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public class User : BaseEntity, ILogicDeletedEntity
{
#region 属性
/// <summary>
/// 【用户名】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定的用户名(账户、昵称)。
/// </remarks>
/// </summary>
public string Name { get; set; }
/// <summary>
/// 【电子邮箱】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定用户所对应的电子邮箱。
/// </remarks>
/// </summary>
public string Email { get; set; }
/// <summary>
/// 【密码】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定用户所对应的密码。
/// </remarks>
/// </summary>
public string Password { get; set; }
/// <summary>
/// 【手机号】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定用户所对应的手机号。
/// </remarks>
/// </summary>
public string Phone { get; set; }
/// <summary>
/// 【记住我(Token)】
/// <remarks>
/// 摘要:
/// 获取/设置把1个指定用户在执行登录操作后,当时所产生的Token字符串。
/// </remarks>
/// </summary>
public string RememberToken { get; set; }
/// <summary>
/// 【头像】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定用户所对应的头像图片的名称(带扩展名)。
/// </remarks>
/// </summary>
public string Avatar { get; set; }
/// <summary>
/// 【启用?】
/// <remarks>
/// 摘要:
/// 获取/设置1个值false(禁用)/true(默认值:启用),该值指示用户实体的1个指定实例是否处于启用状态。
/// </remarks>
/// </summary>
public bool IsActive { get; set; }
#region 属性--ILogicDeletedEntity
/// <summary>
/// 【(逻辑)删除?】
/// <remarks>
/// 摘要:
/// 获取/设置1个值false(未(逻辑)删除)/true(已经(逻辑)删除),该值指示用户实体的1个指定实例是否已经处于(逻辑)删除状态。
/// </remarks>
/// </summary>
public bool Deleted { get; set; }
#endregion
/// <summary>
/// 【创建时间】
/// <remarks>
/// 摘要:
/// 获取/设置用户实体1个指定实例第1次被持久化到角色表中的时间。
/// </remarks>
/// </summary>
public DateTime CreatedDateTime { get; set; }
/// <summary>
/// 【创建时间】
/// <remarks>
/// 摘要:
/// 获取/设置用户实体1个指定实例最后1次被修改后,持久化到角色表中的时间。
/// </remarks>
/// </summary>
public DateTime UpdatedDateTime { get; set; }
#endregion
#region 属性--映射和级联构建
/// <summary>
/// 【角色集】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定用户实例所对应的所有角色实例。
/// 说明:
/// 构建用户与角色实体及其表之间的n:n映射关系,但在实现和逻辑定义实现上以用户为主。
/// </remarks>
/// </summary>
public virtual ICollection<Role> RoleCollection { get; set; }
/// <summary>
/// 【用户角色映射集】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定用户实例所对应的所有用户角色映射实例。
/// 说明:
/// 构建用户与用户角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以用户为主。
/// </remarks>
/// </summary>
public virtual ICollection<UserRole> UserRoleCollection { get; set; }
#endregion
}
}
1.5 Core.Domain.UserRole
namespace Core.Domain.Users
{
/// <summary>
/// 【用户角色映射--类】
/// <remarks>
/// 摘要:
/// 1、通过该实体类及其属性成员,用于实现当前程序【Core】.【领域】.【用户集】.【用户角色映射】实体与“[ShopDemo].[UserRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// 2、构建用户实体与角色实例之间的n:n映射关系;构建用户表与角色表之间的n:n级联关系。
/// </remarks>
/// </summary>
public class UserRole : BaseEntity
{
#region 属性
/// <summary>
/// 【用户编号】
/// <remarks>
/// 摘要:
/// 获取/设置用户实体1个指定实例的长整型编号值。
/// </remarks>
/// </summary>
public long UserId { get; set; }
/// <summary>
/// 【角色编号】
/// <remarks>
/// 摘要:
/// 获取/设置角色实体1个指定实例的长整型编号值。
/// </remarks>
/// </summary>
public long RoleId { get; set; }
#endregion
#region 属性--映射和级联构建
/// <summary>
/// 【单个用户】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定用户角映色射实例所对应的1个用户实例。
/// 说明:
/// 构建用户与用户角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以用户为主。
/// </remarks>
/// </summary>
public virtual User UserSingle { get; set; }
/// <summary>
/// 【单个角色】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定用户角映色射实例所对应的1个角色实例。
/// 说明:
/// 构建角色与用户角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以角色为主。
/// </remarks>
/// </summary>
public virtual Role RoleSingle{ get; set; }
#endregion
}
}
1.6 Core.Domain.Permission
namespace Core.Domain.Security
{
/// <summary>
/// 【权限--类】
/// <remarks>
/// 摘要:
/// 通过该实体类及其属性成员,用于实现当前程序【Core】.【领域】.【安全】.【权限】实体与“[ShopDemo].[权限]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public class Permission : BaseEntity
{
#region 属性
/// <summary>
/// 【权限名】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定的权限名。
/// </remarks>
/// </summary>
public string Name { get; set; }
/// <summary>
/// 【模块】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定权限实例所对应的模块名,即该模拟拥有该权限。
/// </remarks>
/// </summary>
public string Category { get; set; }
#endregion
#region 属性--映射和级联构建
/// <summary>
/// 【权限角色映射集】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定权限实例所对应的所有权限角色映射实例。
/// 说明:
/// 构建权限与角色实体及其表之间的n:n映射关系,但在实现和逻辑定义实现上二者是平等关系。
/// </remarks>
/// </summary>
public virtual ICollection<PermissionRole> PermissionRoleCollection { get; set; }
#endregion
}
}
1.7 Core.Domain. PermissionRole
//项目
using Core.Domain.Users;
namespace Core.Domain.Security
{
/// <summary>
/// 【权限角色映射--类】
/// <remarks>
/// 摘要:
/// 1、通过该实体类及其属性成员,用于实现当前程序【Core】.【领域】.【安全】.【权限角色映射】实体与“[ShopDemo].[PermissionRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// 2、构建权限实体与角色实例之间的n:n映射关系;构建权限表与角色表之间的n:n级联关系。
/// </remarks>
/// </summary>
public class PermissionRole : BaseEntity
{
#region 属性
/// <summary>
/// 【权限编号】
/// <remarks>
/// 摘要:
/// 获取/设置权限实体1个指定实例的长整型编号值。
/// </remarks>
/// </summary>
public long PermissionId { get; set; }
/// <summary>
/// 【角色编号】
/// <remarks>
/// 摘要:
/// 获取/设置角色实体1个指定实例的长整型编号值。
/// </remarks>
/// </summary>
public long RoleId { get; set; }
#endregion
#region 属性--映射和级联构建
/// <summary>
/// 【单个权限】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定权限角映色射实例所对应的1个权限实例。
/// 说明:
/// 构建权限与权限角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以权限为主。
/// </remarks>
/// </summary>
public virtual Permission PermissionSingle { get; set; }
/// <summary>
/// 【单个角色】
/// <remarks>
/// 摘要:
/// 获取/设置1个指定权限角映色射实例所对应的1个角色实例。
/// 说明:
/// 构建角色与权限角色映射实体及其表之间的1:n映射关系,但在实现和逻辑定义实现上以角色为主。
/// </remarks>
/// </summary>
public virtual Role RoleSingle { get; set; }
#endregion
}
}
2 Data.EFCoreContext
//Nuget
//Nuget--Microsoft.EntityFrameworkCore.SqlServer
using Microsoft.EntityFrameworkCore;
//项目
using Core.Domain.Security;
using Core.Domain.Users;
namespace Data
{
/// <summary>
/// 【EFCore上下文】
/// <remarks>
/// 摘要:
/// 基类构造方法通过该类构造方法中的参数实例,实例化了“Microsoft.EntityFrameworkCore.SqlServer”中间件,
/// 以实现“Microsoft.EntityFrameworkCore.SqlServer”中间件与指定数据库(SQL Server)数据库软件中的指定数据库的连接,
/// 最终达到实体与相应表之间通过“Microsoft.EntityFrameworkCore.SqlServer”中间件进行CURD的交互操作的目的(功能)。
/// </remarks>
/// </summary>
public class EFCoreContext : DbContext
{
#region 拷贝构造方法
///<param name="options">配置参数实例,通过配置参数实例,调用基类的拷贝构造方法以实现“Microsoft.EntityFrameworkCore.SqlServer”中间件与(SQL Server)数据库软件中指定数据库的连接。</param>
/// <summary>
/// 【拷贝构造方法】
/// <remarks>
/// 摘要:
/// 基类构造方法通过该类构造方法中的参数实例,实例化了“Microsoft.EntityFrameworkCore.SqlServer”中间件,
/// 以实现“Microsoft.EntityFrameworkCore.SqlServer”中间件与指定数据库(SQL Server)数据库软件中的指定数据库的连接,
/// 最终达到实体与相应表之间通过“Microsoft.EntityFrameworkCore.SqlServer”中间件进行CURD的交互操作的目的(功能)。
/// </remarks>
/// </summary>
public EFCoreContext(DbContextOptions<EFCoreContext> options) : base(options)
{
//如果(SQL Server)数据库软件中没有指定的数据库, 当通过Code First模式时,在第1次生成数据库时,则通过下1行语句结合数据库连接字符串,在(SQL Server)数据库软件中生成指定的数据库数据库、表和字段。
Database.EnsureCreated();
/*
如果(SQL Server)数据库软件中没有指定的数据库, 当通过Code First模式时,在第1次生成数据库时,则也通过下行执行迁移和更新命令行的结合数据库连接字符串,在(SQL Server)数据库软件中生成指定的数据库数据库、表和字段。
Add-Migration Initialize(Initialize:自动生成的迁移类名,这里特指:20220803125612_Initialize.cs):
Update-Database Initialize(通过自动生成的迁移类中的定义,自动在指定的数据库软件中生成指定的数据库、表、字段和约束规则)
*/
}
#endregion
#region 属性
/// <summary>
/// 【角色数据库设置】
/// <remarks>
/// 摘要:
/// 获取/设置角色实体的数据库设置实例,用于实现当前程序【Core】.【领域】.【用户集】.【角色】实体与“[ShopDemo].[Role]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public DbSet<Role> RoleDbSet { get; set; }
/// <summary>
/// 【用户数据库设置】
/// <remarks>
/// 摘要:
/// 获取/设置用户实体的数据库设置实例,用于实现当前程序【Core】.【领域】.【用户集】.【用户】实体与“[ShopDemo].[User]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public DbSet<User> UserDbSet { get; set; }
/// <summary>
/// 【用户角色映射数据库设置】
/// <remarks>
/// 摘要:
/// 获取/设置用户角色映射实体的数据库设置实例,用于实现当前程序【Core】.【领域】.【用户集】.【用户角色映射】实体与“[ShopDemo].[UserRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public DbSet<UserRole> UserRoleDbSet { get; set; }
/// <summary>
/// 【权限数据库设置】
/// <remarks>
/// 摘要:
/// 获取/设置权限实体的数据库设置实例,用于实现当前程序【Core】.【领域】.【安全】.【权限】实体与“[ShopDemo].[权限]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public DbSet<Permission> PermissionDbSet { get; set; }
/// <summary>
/// 【权限角色映射数据库设置】
/// <remarks>
/// 摘要:
/// 获取/设置权限角色映射实体的数据库设置实例,用于实现当前程序【Core】.【领域】.【用户集】.【权限角色映射】实体与“[ShopDemo].[PermissionRole]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。
/// </remarks>
/// </summary>
public DbSet<PermissionRole> PermissionRoleDbSet { get; set; }
#endregion
#region 方法--私有/保护--覆写
///<param name="builder">模型生成器实例,用于把当前程序中实体和属性所定义的约束规则,映射到数据库指定表及其字段上。</param>
/// <summary>
/// 【模型生成执行...】
/// <remarks>
/// 摘要:
/// 该方法把当前程序中实体和属性所定义的约束规则,映射到数据库指定表及其字段上。
/// </remarks>
/// </summary>
protected override void OnModelCreating(ModelBuilder builder)
{
//角色表及其字段约束规则,映射定义。
builder.Entity<Role>().ToTable(nameof(Role));
builder.Entity<Role>().HasKey(role => role.Id);
builder.Entity<Role>().Property(role => role.Name).IsRequired().HasMaxLength(255);
//用户表及其字段约束规则,映射定义。
builder.Entity<User>().ToTable(nameof(User));
builder.Entity<User>().HasKey(user => user.Id);
builder.Entity<User>().Property(user => user.Name).IsRequired().HasMaxLength(255);
builder.Entity<User>().Property(user => user.Email).IsRequired().HasMaxLength(255);
builder.Entity<User>().Property(user => user.Password).IsRequired().HasMaxLength(255);
builder.Entity<User>().Property(user => user.Phone).HasMaxLength(50);
builder.Entity<User>().Property(user => user.RememberToken).HasMaxLength(500);
builder.Entity<User>().Property(user => user.Avatar).HasMaxLength(255);
builder.Entity<User>().Property(user => user.CreatedDateTime).IsRequired();
builder.Entity<User>().Property(user => user.UpdatedDateTime).IsRequired();
builder.Entity<User>().Ignore(user => user.RoleCollection);
//用户角色映射表及其字段约束规则,映射定义。
builder.Entity<UserRole>().ToTable(nameof(UserRole));
builder.Entity<UserRole>().HasKey(userRole => new { userRole.UserId, userRole.RoleId });
builder.Entity<UserRole>()
.HasOne(userRole => userRole.UserSingle)
.WithMany(user=>user.UserRoleCollection)
.HasForeignKey(userRole => userRole.UserId)
.IsRequired();
builder.Entity<UserRole>()
.HasOne(userRole => userRole.RoleSingle)
.WithMany()
.HasForeignKey(userRole=> userRole.RoleId)
.IsRequired();
builder.Entity<UserRole>().Ignore(userRole => userRole.Id);
//权限表及其字段约束规则,映射定义。
builder.Entity<Permission>().ToTable(nameof(Permission));
builder.Entity<Permission>().HasKey(permission => permission.Id);
builder.Entity<Permission>().Property(permission => permission.Name).IsRequired().HasMaxLength(255);
builder.Entity<Permission>().Property(permission => permission.Category).IsRequired().HasMaxLength(500);
//权限角色映射表及其字段约束规则,映射定义。
builder.Entity<PermissionRole>().ToTable(nameof(PermissionRole));
builder.Entity<PermissionRole>().HasKey(permissionRole => new { permissionRole.PermissionId, permissionRole.RoleId });
builder.Entity<PermissionRole>()
.HasOne(permissionRole => permissionRole.PermissionSingle)
.WithMany(permission => permission.PermissionRoleCollection)
.HasForeignKey(permissionRole => permissionRole.PermissionId)
.IsRequired();
builder.Entity<PermissionRole>()
.HasOne(permissionRole => permissionRole.RoleSingle)
.WithMany(role=>role.PermissionRoleCollection)
.HasForeignKey(permissionRole => permissionRole.RoleId)
.IsRequired();
builder.Entity<PermissionRole>().Ignore(permissionRole => permissionRole.Id);
base.OnModelCreating(builder);
}
#endregion
}
}
3 启动项
3.1 appsettings.json
"ConnectionStrings": {
//Trusted_Connection=true或Integrated Security=true/SSPI:“Windows凭据”对SQL Server进行身份验证,表示可以在不知道数据库用户名和密码的情况下时,依然可以连接SQL Server数据库。
//"integrated":"security=true是通过“Windows身份认证”对SQL Server数据库进行身份验证,并与SQL Server数据库进行连接;表示可以在不知道数据库用户名和密码的情况下时,依然可以连接SQL Server数据库,如果integrated", "security=false","或者不写,表示一定要输入正确的数据库登录名和密码。": null。
//Persist Security Info:该配置只用于通过“SQL Server身份认证”对SQL Server数据库进行身份验证,并与SQL Server数据库进行连接;简单的理解为"ADO在数据库连接成功后是否保存密码信息",True表示保存,False表示不保存.ADO缺省为True(ADO.net缺省为False,未测试,根据参考资料上说的)。
//MultipleActiveResultSets:它允许在单个连接上执行多重的数据库查询或存储过程,目前只适用于Sql Server 2005及其以上版本;如果不用MultipleActiveResultSets ,则一般报错为sqldatareader未关闭,即需要关闭了之后才能打开另一个。
//Trust Server Certificate:是否使用SSL证书和加密方式,对SQL Server数据库的连接字符串进行加密,该操作属性安全性配置,目前只适用于Sql Server 2005及其以上版本;
"SqlServerWindows": "Data Source=.;Initial Catalog=ShopDemo;Integrated Security=true;MultipleActiveResultSets=true;Trust Server Certificate=True"
//"SqlServerSQL": "Data Source=.;Initial Catalog=ShopDemo;Integrated Security=False;Persist Security Info=False;User ID=zz;Password=zz;MultipleActiveResultSets=true;Trust Server Certificate=True"
},
3.2 Program.cs
var builder = WebApplication.CreateBuilder(args);
//把“Microsoft.EntityFrameworkCore.SqlServer”中间件实例,依赖注入到.Net(Core)6框架内置容器中。
builder.Services.AddDbContext<EFCoreContext>(
//通过“DbContextOptionsBuilder”实例中的参数实例,为“Microsoft.EntityFrameworkCore.SqlServer”中间件的实例化提供参数实例,
//最终把“Microsoft.EntityFrameworkCore.SqlServer”中间件实例,依赖注入到.Net(Core)6框架内置容器中。
options => options.UseSqlServer(builder.Configuration.GetConnectionString("SqlServerWindows")));
builder.Services.AddControllers();
3.3 WebApi.Controllers.WeatherForecastController
using Core.Domain.Users;
using Data;
using Microsoft.AspNetCore.Mvc;
namespace WebApi.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly EFCoreContext _context;
public WeatherForecastController(EFCoreContext context)
{
_context = context;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<Role> Get()
{
return _context.RoleDbSet.ToList();
}
}
}
按F5执行程序,执行“GetWeatherForecast”Api,即可自动生成数据库及其表。
对以上功能更为具体实现和注释见:221219_001ShopDemo(数据及其表的自动生成)。