如何在 .NET Core EF Core中实现多对多的表映射关系
首先创建两个实体与一个关联实体
/// <summary>
/// 角色实体
/// </summary>
public class Role
{
/// <summary>
/// 角色GUID
/// </summary>
[Key]
//[MaxLength(36)]
[StringLength(36, MinimumLength =36)]
[RegularExpression(Constants.GUID_REG, ErrorMessage =Constants.GUID_ERR)]
public string Id { get; set; }
/// <summary>
/// 角色名称
/// </summary>
//[MaxLength(15)]
[StringLength(15, MinimumLength = 2)]
[RegularExpression(Constants.VISIBLE_REG, ErrorMessage =Constants.VISIBLE_ERR)]
public string Name { get; set; }
/// <summary>
/// 角色描述
/// </summary>
[MaxLength(255)]
public string Decription { get; set; }
/// <summary>
/// 用户角色
/// </summary>
[NotMapped]
public List<UserRole> UserRoles { get; set; }
}
/// <summary>
/// 用户实体
/// </summary>
public class UserBase
{
/// <summary>
/// 用户ID
/// </summary>
[Key]
[MaxLength(36)]
[RegularExpression(Constants.GUID_REG, ErrorMessage = Constants.GUID_ERR)]
public string Id { get; set; }
/// <summary>
/// 用户签名
/// </summary>
[MaxLength(15)]
[RegularExpression(Constants.SIGNNAME_REG, ErrorMessage = Constants.SIGNNAME_ERR)]
public string SignName { get; set; }
/// <summary>
/// 用户密码
/// </summary>
[MaxLength(63)]
[RegularExpression(Constants.PASSWORD_REG, ErrorMessage = Constants.PASSWORD_ERR)]
public string PassWord { get; set; }
/// <summary>
/// 用户角色
/// </summary>
[NotMapped]
public List<UserRole> UserRoles { get; set; }
}
/// <summary>
/// 用户与角色关联
/// </summary>
public class UserRole
{
/// <summary>
/// 关联ID
/// </summary>
public string Id { get; set; }
/// <summary>
/// 用户ID
/// </summary>
public string UserId { get; set; }
/// <summary>
/// 角色ID
/// </summary>
public string RoleId { get; set; }
/// <summary>
/// 用户
/// </summary>
[NotMapped]
[ForeignKey("UserId")]
public UserBase User { get; set; }
/// <summary>
/// 角色
/// </summary>
[NotMapped]
[ForeignKey("RoleId")]
public Role Role { get; set; }
}
其次在DbContext中添加数据
/// <summary>
/// 数据库上下文
/// </summary>
public class ApplicationDbContext : DbContext
{
/// <summary>
/// 构造器
/// </summary>
public ApplicationDbContext() { }
/// <summary>
/// 应用数据库上下文
/// </summary>
/// <param name="options"></param>
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options){ }
#region << DbSet 数据集 >>
/// <summary>
/// 用户数据集
/// </summary>
public DbSet<UserBase> UserBases { get; set; }
/// <summary>
/// 角色数据集
/// </summary>
public DbSet<Role> Roles { get; set; }
/// <summary>
/// 用户角色
/// </summary>
public DbSet<UserRole> UserRoles { get; set; }
#endregion
/// <summary>
/// 在模型创建时
/// </summary>
/// <param name="builder"></param>
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
#region << 模型映射 >>
builder.Entity<UserBase>(b =>
{
b.ToTable("userbase");
b.HasIndex(p => p.SignName).IsUnique();
});
builder.Entity<Role>(b =>
{
b.ToTable("role"); //.HasIndex(prop=>prop.Name).IsUnique();
//b.Property(p => p.Name);
//b.Property(p => new { p.Name, p.Id });
});
builder.Entity<UserRole>(b =>
{
b.ToTable("userrole").HasKey(prop => new { prop.RoleId, prop.UserId });
// 多对多关联 -外键在各个实体上用特性标识
b.HasOne(ur => ur.User).WithMany(u => u.UserRoles);
b.HasOne(ur => ur.Role).WithMany(r => r.UserRoles);
});
#endregion
}
/// <summary>
/// 数据库配置
/// </summary>
/// <param name="builder">数据库上下文选项创建器</param>
protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
base.OnConfiguring(builder);
// Pomelo.EntityFrameworkCore.MySql
// TODO: 采用配置文件的方式
builder.UseMySql("server=localhost;database=moretomore;user=admin;password=123456;");
}
}