• 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)

    
    


     
     
  • 相关阅读:
    [原]java开发文档的自动生成方式 java程序员
    帮助查看本地表单元素样子的网站 Native Form Elements java程序员
    Thingjs 开门示例:以3D机柜为例 演示thingjs如何开门
    基于WebGL架构的3D可视化平台—实现汽车行走路线演示
    WebGL的3D框架比较 ThingJS 和 Three.js
    重庆新闻联播 报道 thingJS 项目 反恐3D可视化预案 多警种3D可视化预案系统
    腾讯滨海大厦 智能楼宇 智慧建筑 3D可视化管理系统优锘科技ThingJS物联网开发案例
    基于WebGL架构的3D可视化平台—新风系统演示
    基于WebGL架构的3D可视化平台—三维设备管理(ThingJS实现楼宇设备管理3D可视化)
    【教程】ThingJS 3D开发快速入门 第一讲 开发概述·优势·项目流程
  • 原文地址:https://www.cnblogs.com/bamboo-zhang/p/11389169.html
Copyright © 2020-2023  润新知