(C#, .NET)EFCore 多对多的表映射关系

1 篇文章 0 订阅
1 篇文章 0 订阅

如何在 .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;");
        }
    }
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值