代码改变世界

ABP问题速查表

2018-11-14 15:04  叶伟民  阅读(1298)  评论(0编辑  收藏  举报

如果你领导要让你一夜之间掌握ABP,并且用ABP撸一个项目出来,你很可能很快速的过了一遍ABP文档就马上动手干活了。那么这篇文章就很适合你。

这篇文章列出了很多ABP新手问的问题和解答。注:有些同学问出了很有深度的问题,比如下面的第二个问题,但是这些问题不属于快速解决问题范畴(即速查表),所以把这些问题归类到了这篇文章《ABP有深度的问题》

这篇文章有些问题其实是不属于ABP范畴的,然而ABP新手经常会遇到,所以还是列在这篇文章里面。

大家都知道IT世界变化很快,昨天的答案也许完全不适用今天。所以如果你发现答案过时了,请告诉我去更新,谢谢。

本文推荐使用方法:先直接Ctrl+F查找你的关键字,不行再慢慢看,因为我知道你看这篇文章的时候肯定很赶时间。

这篇文章会不断更新。

  1. 问:ABP是否支持VS2005 + MS SQL 2008? :ABP支持VS2005, 但是ABP不支持MS SQL  2008 (我已经被坑过了),最低支持是MS SQL 2012
  2. 问:ABP的Entity 主键是怎么自动设置的?Entity和IEntity的源码都没看到[Key]标注啊。 :不用标注key,直接继承FullAuditedEntity<你的key的数据类型> 即可。注意:这只是这个同学问的问题的一部分,另一部分是:“我是想知道ABP是怎么做到只用继承这个就自动设置的”。这个问题很有深度,但是不属于快速解决问题范畴(即速查表),所以归类到了这篇文章《ABP有深度的问题》
  3. 问:我从官网下载ABP的Asp.net core + MPA版本为啥编译不通过? :这个版本支持很不好,我在不同时间下载过几次这个版本,从来没有被编译通过过,所以我已经放弃了这个版本了。
  4. 问:一个多对多的中间表,entity又想继承FullAuditedEntity,又想使用另外的2个id来做主键,需要怎么处理?继承FullAuditedEntity会自动生成ID自增长,且自动生成IsDeleted、CreationTime等字段。但又想用另外的id(如CityId,companyId)做中间表的ID控制避免重复数据。改如何处理?:使用复合主键即可,用如下代码把CityId, companyid做成复合主键。
    [Key, Column(Order = 2)]
    public int CityId{ get; set; }
    
    [Key, Column(Order = 3)]
    public int companyId{ get; set; }
    

      

    关于这个答案有同学有不同见解,然而这篇文章目的是让新手看完后马上解决问题,因此采用了这个答案

  5. 问:ABP的AppService在class级设置了权限,那如何在这个class里的具体某个method支持匿名访问?:在这个method头部加上 [AbpAllowAnonymous] 即可
  6. 问:abp angular spa版本如何支持在开发机器和服务器上设置不同的config? :1. 在/assets/appconfig.json添加属性和值。2. 修改AppPreBootstrap.ts里的getApplicationConfig方法来支持读取这个值。3. 搞两份appconfig.json,开发机器一份,服务器一份,部署后自动替换为对应的appconfig.json文件
  7. 问:修改某个记录,当字段值是enum的时候,控件是dropdownlist / select / radio等可选择控件时,总是加载不出正确的值。:可选择控件的选项值一定要加[],比如nz-select的nz-option的nzValue一定要加[]写成[nzValue],这点和传统的javascript/html区别很大。
  8. 为啥abp3.6版本的UserManager有CreateIdentityAsync方法,而3.8版本却没有了。项目升级怎么办?: 因为abp用的auth升级了。请参考https://github.com/aspnet/Security/issues/1310 去升级。
  9. 为啥使用{{time | date:'yyyy-MM-dd HH:mm'}}在Chrome下可以输出值,在IE11下不可以?:angular的datetime pipe对IE兼容性很差,最安全的办法是在ts文件写好函数封装好,比如:
      formatDateTime(input: string): string {
        // moment("2016-01-17T:08:44:29+0100").format('MM/DD/YYYY');
        return moment(input).format('YYYY-MM-DD HH:mm');
      }
    

     


    然后在html调用,比如 {{formatDateTime(time)}}
  10. 项目到了一定规模,第一次加载很慢,怎么调优?答:最快最有效的办法是启用Lazy load, 参考这两篇文章:https://angular.cn/guide/router#lazy-loading-route-configuration 和 https://angular.cn/guide/lazy-loading-ngmodules
  11. angular/typescript是否支持字典dictionary? 答:支持。代码如下
    ApplyCount: { [key: string]: boolean; } = {};

     代码里的boolean是字典dictionary中value的类型,要根据你实际情况来修改

  12. 为啥有时候返回结果显示undocumented 或者一片空白?答:先看看应当返回null时能否正常显示,如果可以那就是返回结果的dto类型里有循环引用