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()]
private string Discriminator { get { return "UserExtend"; } }
}

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 = ;
public const int Length10 = ;
public const int Length16 = ;
public const int Length20 = ;
public const int Length30 = ;
public const int Length32 = ;
public const int Length50 = ;
public const int Length64 = ;
public const int Length100 = ;
public const int Length128 = ;
public const int Length200 = ;
public const int Length255 = ;
public const int Length300 = ;
public const int Length500 = ;
public const int Length512 = ;
public const int Length1000 = ;
public const int Length4000 = ; public const int Length1024 = ; }

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)



 
 

AbpUser 扩展的更多相关文章

  1. 在ABPZERO中,扩展实体的方法。

    内容 介绍 扩展的抽象实体 将新属性添加给用户 添加迁移 在界面上显示地址 在用户编辑/添加功能中添加地址 扩展的非抽象类实体 获得版本的派生实体 添加迁移 在界面上添加价格 在创建/编辑版本功能中加 ...

  2. abp加DDD开发:低耦合、可复用、可扩展的【工单】业务模块-简介和集成

    前言 很多场景[单体+模块化]比微服务更合适,开发难度低.代码可复用性强.可扩展性强.模块化开发有些难点,模块启动与卸载.模块之间的依赖和通讯.asp.net core abp为我们提供了模块化开发能 ...

  3. Asp.net Boilerplate之AbpSession扩展

    当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...

  4. 恢复SQL Server被误删除的数据(再扩展)

    恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...

  5. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

  8. Dapper扩展之~~~Dapper.Contrib

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章:Dapper逆天入门~强类型,动态类型 ...

  9. ExtJS 4.2 Date组件扩展:添加清除按钮

    ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...

随机推荐

  1. java-selenium-java鼠标键盘操作Actions类和Robot

    Actions类 一.鼠标右击.双击 Java代码 //定位百度首页右上角 新闻 WebElement Xw=driver.findElement(By.xpath("//*[@id='u1 ...

  2. oracle 插入数据之坑--------oracle字符类型varchar2一个中文占多少字节

    如果你误认为是两个字节,那就大错特错了 Oracle 一个中文汉字 占用几个字节,要根据Oracle中字符集编码决定 查看oracle server端字符集 select userenv('langu ...

  3. HDU-5238 Calculator

    题目描述 给定一个关于 \(x\) 的表达式,形如下例:\(×4+2^3+8×6\) 按如下方法计算:\((((x×4)+2)^3+8)×6\) 运算符只有 加号,乘号,幂运算三种,给定的式子中有 \ ...

  4. HDU 4292 Food (建图思维 + 最大流)

    (点击此处查看原题) 题目分析 题意:某个餐馆出售f种食物,d种饮料,其中,第i种食物有fi份,第i种饮料有di份:此时有n个人来餐馆吃饭,这n个人必须有一份食物和一份饮料才会留下来吃饭,否则,他将离 ...

  5. Java NIO浅析 转至 美团技术团队

    出处: Java NIO浅析 NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服 ...

  6. redis 学习(10)-- redis 慢查询

    redis 慢查询 什么是慢查询 MySQL会记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询,都记在慢查询日志里. redis 的生命周期 客户端向Redis服务器发送命令 ...

  7. 浅析java中clone()方法

    本文转载自:http://blog.csdn.net/mengxiangyue/article/details/6818611 Java中我们可能都遇到过这样的情况,在我们将一个对象做为参数传给一个函 ...

  8. 异常-finally关键字的特点及作用

    package cn.itcast_07; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...

  9. Java 获取日期间的日期 & 根据日期获取星期

    场景:根据起止日期获取中间的日期: 根据日期获取当前日期的星期 根据日期日期获取日期 /** * 获取日期间日期 * @param start * @param end * @return */ pr ...

  10. Java定义队结构,实现入队、出队操作

    package com.example.demo; import java.util.ArrayList; public class Queue { ArrayList<Object> l ...