AbpUser 扩展

AbpUser表存放的信息比较少,现扩展一下信息

1、在Core层添加UserExtend 类,继承 AbpUser<User>,写入以上各项属性字段,并添加Discriminator 字段,Discriminator用于指明数据所在实体的名称,最终代码如下:(不需要扩展ID和用户ID,发布了折叠的代码无法编辑┭┮﹏┭┮)

public class UserExtend: AbpUser<User>
    {
        #region Public Property
        ///<Summary>
        /// Id 用户信息ID
        ///</Summary>
        [Display(Name = "用户信息ID")]
        public long Id { get; set; }
        ///<Summary>
        /// UserId 用户ID
        ///</Summary>
        [Display(Name = "用户ID")]
        public long UserId { get; set; }
        ///<Summary>
        /// GroupID 分组:机构型,客户型
        ///</Summary>
        [Display(Name = "分组:机构型,客户型")]
        public int GroupID { get; set; }
        ///<Summary>
        /// Avatar 头像
        ///</Summary>
        [Display(Name = "头像")]
        public string Avatar { get; set; }
        ///<Summary>
        /// Sex 性别
        ///</Summary>
        [Display(Name = "性别")]
        public int Sex { get; set; }
        ///<Summary>
        /// Birthday 生日
        ///</Summary>
        [Display(Name = "生日")]
        public DateTime Birthday { get; set; }
        ///<Summary>
        /// Province 省
        ///</Summary>
        [Display(Name = "")]
        public string Province { get; set; }
        ///<Summary>
        /// City 市
        ///</Summary>
        [Display(Name = "")]
        public string City { get; set; }
        ///<Summary>
        /// County 县
        ///</Summary>
        [Display(Name = "")]
        public string County { get; set; }
        ///<Summary>
        /// Address 联系地址
        ///</Summary>
        [Display(Name = "联系地址")]
        public string Address { get; set; }
        ///<Summary>
        /// QQ QQ
        ///</Summary>
        [Display(Name = "QQ")]
        public string QQ { get; set; }
        ///<Summary>
        /// WeChat 微信
        ///</Summary>
        [Display(Name = "微信")]
        public string WeChat { get; set; }
        ///<Summary>
        /// DingTalk 钉钉
        ///</Summary>
        [Display(Name = "钉钉")]
        public string DingTalk { get; set; }
        ///<Summary>
        /// Skype Skype
        ///</Summary>
        [Display(Name = "Skype")]
        public string Skype { get; set; }
        ///<Summary>
        /// WhatsApp WhatsApp
        ///</Summary>
        [Display(Name = "WhatsApp")]
        public string WhatsApp { get; set; }
        ///<Summary>
        /// Stack Stack
        ///</Summary>
        [Display(Name = "Stack")]
        public string Stack { get; set; }
        #endregion

        /// <summary>
        /// 自定义实体类名称 
        /// </summary>
        [MaxLength(50)]
        private string Discriminator { get { return "UserExtend"; } }
    }
View Code

2、在EF层的EntityMapper文件夹中添加配置信息,将生成的表名指向 AbpUsers,最终代码如下:

   /// <summary>
   /// Description 户信息补充
   /// </summary>
   public class UserExtendCfg : IEntityTypeConfiguration<UserExtend>
   {  
        public void Configure(EntityTypeBuilder<UserExtend> builder)
        {
            builder.ToTable("AbpUsers");
            builder.Property(a => a.Avatar).HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length255);               
            builder.Property(a => a.Address).HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length255);        
            builder.Property(a => a.QQ).HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length50);        
            builder.Property(a => a.WeChat).HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length50);        
            builder.Property(a => a.DingTalk).HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length50);        
            builder.Property(a => a.Skype).HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length50);        
            builder.Property(a => a.WhatsApp).HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length50);        
            builder.Property(a => a.Stack).HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length50);

            builder.Property(a => a.Province).HasColumnType("char(20)").HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length20);
            builder.Property(a => a.City).HasColumnType("char(20)").HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length20);
            builder.Property(a => a.County).HasColumnType("char(20)").HasMaxLength(YoYoAbpefCoreConsts.EntityLengthNames.Length20);
        }
   }

注意char类型数据的写法,如果不这样写生成的依然是nvarchar,

YoYoAbpefCoreConsts.EntityLengthNames.Length20 是const的长度,具体定义如下:
/// <summary>
        /// 实体长度单位
        /// </summary>
        public static class EntityLengthNames
        {
            public const int Length8 = 8;
            public const int Length10 = 10;
            public const int Length16 = 16;
            public const int Length20 = 20;
            public const int Length30 = 30;
            public const int Length32 = 32;
            public const int Length50 = 50;
            public const int Length64 = 65;
            public const int Length100 = 100;
            public const int Length128 = 128;
            public const int Length200 = 200;
            public const int Length255 = 255;
            public const int Length300 = 300;
            public const int Length500 = 500;
            public const int Length512 = 512;
            public const int Length1000 = 1000;
            public const int Length4000 = 4000;


            public const int Length1024 = 1024;

        }

3、在EF层 DbContext中增加:

    public DbSet<UserExtend> UserExtends { get; set; }
在EF层 DbContext类OnModelCreating方法中添加以下代码 替换原来的数据库生成配置

  modelBuilder.ApplyConfiguration(new UserExtendCfg());

4、然后就是执行数据库迁移了,然而,居然是错的。。。。。。。。。。。第一反应就是尼玛,组织机构都是这样扩展的啊,怎么到了用户就不行了呢XXXXXXXXXX
百度了半天,也没有相关的文章,没有一点头绪,只好一点点的比对代码,然后总觉得继承的那个 AbpUser<User>怪怪的,顺便把角色也翻出来看了一下,然后发现,角色下面有这样一段,豁然开朗:

原来 AbpUser<User> 就是对用户的扩展啊,好了以上可重新整理了

1、将需要扩展的字段搬到 User类下(不需要Discriminator)
2、修改UserExtendCfg 类,让它基于User而不是UserExtend(也就是将上面UserExtendCfg 中的UserExtend全部替换为User啦)
3删掉public DbSet<UserExtend> UserExtends { get; set; }
4、执行迁移
完成效果

这种方法在我后期遇到一个问题,我后面有一次数据库的表结构调整比较大,于是我删了所有的更新日志,然后重建自己更新的这些表,在执行数据库迁移的时候发现,User和Role添加的字段都没有更新到数据库,我反复修改猜想可能的原因,最终百度到这篇大神的文章https://www.cnblogs.com/wer-ltm/p/7097623.html

发现不同的地方是,我的字段不是virtual的,改为virtual就可以了,虽然我有一种错觉,在没有改为virtual之前,我已经看见迁移代码中出现了我要添加的字段,但是没有时间再试了,这个小小的错误,耽误了我半天的时间,先记在这里,后面有时间再试(2019年9月17日)

麻蛋,在我又一次删除所有迁移问题之后,这个问题又出现了!!!!!!!为什么我上次没有记下来几次试错以及恍惚解决时做哪些更改呢,真是太恶心了!!!!!!!!!!!!!!!!!!!!!!这次不知道又要多久啊!!!!!!!!!!!!!!!还有,各位大大没有发生过迁移时删除字段无效的问题吗????每次遇见这种问题,我都只有删了迁移文件重新生成┭┮﹏┭┮(2019-9-27 07:10:41)




 
 
原文地址:https://www.cnblogs.com/bamboo-zhang/p/11389169.html