文档章节

Abp问题解决集合1

徐自勉
 徐自勉
发布于 2017/02/13 17:41
字数 1175
阅读 22
收藏 0

                                                           ABP学习经验

  1. 1.   视图中(控制器中直接使用仓储)会遇到使用实体外键,出现数据库连接关闭的错误

    初学者经常会犯这样一个错误,没错说的就是我自己,这个问题折腾了我很长世间。还是没有细看文档,对abp领会不深。

开始描述问题,一开始我想着方便,因为只是一个简单的表对象输出,该表的entity每个字段都会别输出到视图,所以我想每笔要搞那么麻烦,再去建立一个Dto类,结果我在视图中尝试获取一个entity的外键对象时,出错了,错误的描述就不粘上来了,大意是数据库上下文已被注销,所以不能通过它取数据拿数据。

      出现这个错误的原因很简单:

         比如User类型引用Role类型。当你从数据库获取User时,Role属性并没有被填充。当你第一次读取Role属性时,才会从数据库中加载Role。所以,当你返回这样一个实体给展现层时,很容易引起副作用(从数据库中加载),而abp框架被设计为一旦service或者控制器中的action执行完毕就会自动关掉当前的数据库连接。

  所以建议:

在展现层中使用实体还会有更多的问题。最佳的方案就是展现层不应该引用任何包含领域层的程序集。

  1. 2.  Abp的多租户过滤的问题

    用abp做的第一个公司项目,就是多租户的一个OA管理系统,之前公司一直用mvc,突然要换框架,老板让我带头开始搞这个新项目,没办法,只好硬着头皮上。一开始很多地方搞不定,所以这些地方还是抛弃了abp的原有设计,导致这个框架用得有些不伦不类的,没办法,时间太紧。
   其中,多租户就是一个比较坑的地方。原本就是比较中意abp自动实现多租户过滤这套基础设施的,于是花了大力气做了改写了一套通过数据表生成entity和dbcontext的模板,让生成的entity会根据数据表是否包含tenantid自动继承IMayHaveTenant接口。

   但是,和设计数据库的同事没沟通好,设计的数据表全都关联了另一个代表多租户的数据表的主键,这是其中的坑之一,也就是除了用户表拥有tenantid其他表都没有。

   然后,当然abp多租户自动过滤功能自然有了,但是遇到一个比较悲催的问题,用户登录的时候,多租户依然会去进行过滤,这就导致用户一旦注销登陆状态后,就无法登陆了,(我的abpsession获取tenantid是从cookie中获取的),注销后tenantid是空的,查询所有用户会自动过滤所有tenantid非空的用户,导致获取不了用户

很蛋疼,当时还不知道怎么动态禁用数据自动过滤系统,所以就是用了模块启动时全局禁用多租户,在那个PreInitialize方法中设置,但是无效。所以只好去掉了用户entity继承IMayHaveTenant接口,但是问题还没完,由于项目的也无原因,必须在登陆时不存在数据库的用户进行直接注册,所以需要为新登陆的用户赋予tenantid,然而由于当前的cookie中tenantid为空,多租户机制依然还在起作用,导致不能给一个实体赋予不同于当前tenantid值。

扯了这么多,只是想描述和记录下当时踩坑过程,说实话由于abp的相关资料确实很少,网上基本上都找不到有关问题的直接解答,所以很走了一些弯路。

细看了一些文档后,终于发现如何优雅的解决上面的这个问题:

using(_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.SoftDelete)) {

      var people2 = _personRepository.GetAllList();

    }

这个是禁用软删除的数据过滤,禁用多租户的应该也是可以以此种方式实现的,具体的代码文档没有,需要的自己点一下应该是能很轻易找到的。

  1. 3.  AbpWebapi通过abp的service动态生成的如果service方法返回的对象是数据库Entity,产生“The 'ObjectContent`1' type failed to serialize the response body for content type”错误

这种情况下只能使用自定义的model类,建议使用abp的dtooutput

 

© 著作权归作者所有

共有 人打赏支持
徐自勉
粉丝 2
博文 25
码字总数 34997
作品 0
武汉
程序员
私信 提问
ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十三节--RBAC模式及ABP权限管理(附赠福利)

ABP+AdminLTE+Bootstrap Table权限管理系统一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate-Project-CMS 角色访问控制(RBAC) 角色访问控制(RBAC)应该是目前用得最...

安与生_
2017/11/05
0
0
[Abp 源码分析]七、仓储与 Entity Framework Core

0.简介 Abp 框架在其内部实现了仓储模式,并且支持 EF Core 与 Dapper 来进行数据库连接与管理,你可以很方便地通过注入仓储来操作你的数据。 例如: 1.仓储定义与实现 在 Abp 内部,仓储的基...

myzony
07/24
0
0
ABP架构学习系列一 整体项目结构及目录

本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习。 abp的源码分析学习主要来源于 HK Zhang ,他的博客...

蚊子888
2017/11/30
0
0
[Abp 源码分析]十一、权限验证

0.简介 Abp 本身集成了一套权限验证体系,通过 ASP.NET Core 的过滤器与 Castle 的拦截器进行拦截请求,并进行权限验证。在 Abp 框架内部,权限分为两块,一个是功能(Feature),一个是权限项...

myzony
08/13
0
0
Abp + Grpc 如何实现用户会话状态传递

0.背景 在实际项目当中,我们采用的是 Abp 框架,但是 Abp 框架官方并没有针对 Grpc 进行模块封装。基于此我结合 Abp 与 MagicOnion 封装了一个 Abp.Grpc 模块,它包括服务端和调用端两部分的...

myzony
08/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ViewPager+Fragment+FragmentPagerAdapter实现软件主界面

ViewPager之前的页面是由View构成的,现在由Fragment构成,之前的PagerAdapter这里也换成了FragmentPagerAdapter.因为PagerAdapter有 public Object instantiateItem(ViewGroup container, i......

鱼想吃肉
15分钟前
0
0
feign文件上传遇到的坑

明天写

王俊博客
20分钟前
0
0
scala的sorted,sortBy,sortWith

val lst = List(1,3,2,4,5) //scala中对于集合的排序有三种方法:sorted,sortBy,sortWith //sorted方法对一个集合进行自然排序,传递一个Ordering隐式参数 def sorted[B >: A](imp...

whoisliang
36分钟前
0
0
区块链扩容最佳途径?十分钟讲清楚侧链技术

今天我们来讲区块链扩容的另一个主流方案——侧链,侧链可作为解决区块链扩容难题的一种有效解决方案。有些人认为,从理论上说,这种解决方案可让所有人都满意。 基础概念 侧链协议本质上是一...

HiBlock
37分钟前
0
0
3年经验Java程序员面阿里P6 差距在哪里

虽然这位小伙伴觉得自己工作三年了,结果阿里连面都不面就把自己挂了,这让自己感到很伤心。但是还是有网友觉得,三年不到p6,很正常啊,明年再面就没有问题啦! Java程序员3年经验面阿里P6,...

架构师springboot
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部