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

Abp问题解决集合1的更多相关文章

  1. Python跨域问题解决集合

    Flask 安装插件 pip install flask-cors 使用 CORS函数配置全局路由 from flask_cors import * app = Flask(__name__) COR ...

  2. ABP中的本地化处理(上)

    今天这篇文章主要来总结一下ABP中的多语言是怎么实现的,在后面我们将结合ABP中的源码和相关的实例来一步步进行说明,在介绍这个之前我们先来看看ABP的官方文档,通过这个文档我们就知道怎样在我们的系统中 ...

  3. ABP集合贴

    thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>t ...

  4. ABP集合贴(转)

    ABP集合贴 本文背景 公司最近规划的新框架准备基于ABP来搭建,自从在阳铭博客看到ABP框架的介绍后,就一直持续关注着,但还没真正在实际项目中直接使用ABP,只是自己做了一些学习和Demo.ABP所 ...

  5. ABP Zero示例项目登录报错“Empty or invalid anti forgery header token.”问题解决

    ABP Zero项目,登录时出现如图"Empty or invalid anti forgery header token."错误提示的解决方法: 在 WebModule.cs的P ...

  6. ABP集合帖

    http://www.cnblogs.com/kebinet/p/5341663.html http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent ...

  7. ABP运行Login failed for user 'IIS APPPOOL XXXXX Reason: Could not find a login matching the name provided问题解决

    我们在ABP官网上面生成解决方案后,编译完成,将数据库连接字符串中的Ip改成自己的测试数据库Ip直接在Vs里面调试运行没有任何问题. 发布之后到文件夹后运行,就报如下图异常. VS里面可以跑起来,单独 ...

  8. 当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand问题解决

    1.目前看主要因为两种,第一种是select语句没有包含主键列,select *  就可以解决.或 select 主键列 这里的主键是指的primary key而不是unique key 2.最重要的 ...

  9. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

随机推荐

  1. python-django的生命周期

    wsgi,请求封装后交给web框架(flask,django) 中间件,对请求进行校验或在请求对象中添加其他相关数据,列如(scrf[跨域],request,session) 路由匹配,根据浏览器发送 ...

  2. Python 依赖关系

    class Person: def play(self, tools): # 通过参数的传递把另外一个类的对象传递进来 tools.run() print("很开心, 我能玩儿游戏了&quo ...

  3. zookeeper在Dubbo中扮演了一个什么角色

    作者:guxiangfly链接:https://www.zhihu.com/question/25070185/answer/188238271来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...

  4. Samsung_tiny4412(驱动笔记06)----list_head,proc file system,GPIO,ioremap

    /**************************************************************************** * * list_head,proc fil ...

  5. (3)HTML常用标签 + 快捷字符

    1.<meta charset="UTF-8">  #定义字符编码 2.<!doctype + 类型> #规定文档类型 3.<!-- 注释 --> ...

  6. Java线程池 详解(图解)

    来源:www.jianshu.com/p/098819be088c 拓展: 手动创建 new ThreadPoolExecutor 的使用: https://segmentfault.com/a/11 ...

  7. LeetCode - Convert BST to Greater Tree

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  8. LeetCode – Lemonade Change

    At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you, and ...

  9. 企业库实现AOP的几种方法

    1.创建新对象时,分继承基类和继承接口 TargetClass theTarget = PolicyInjection.Create<TargetClass>(parameter1, pa ...

  10. MongoDB 副本集 pymongo使用

    搭建没有仲裁节点的副本集,推荐使用 2.清空node2的db文件夹 和 log 文件夹 rm -rf /var/lib/mongod/* rm -rf /var/log/mongod/* 3.修改no ...