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. HDU 2585 Hotel(字符串的模糊匹配+递归)

    Problem Description Last year summer Max traveled to California for his vacation. He had a great tim ...

  2. 【git学习笔记】

    一.查看git的配置文件 1.在项目下,有一个.git的隐藏文件 2.config为git的配置文件 3.查看config :branch表示分支,此配置文件表示当前有两个分支NNU和master,一 ...

  3. 【Maven】Project configuration is not up-to-date with pom.xml错误解决方法

    导入一个Maven项目之后发现有一个如下的错误: Project configuration is not up-to-date with pom.xml. Run project configura ...

  4. js获取当天零点的时间戳

    var now_date = new Date();//获取Date对象now_date.setHours(0);//设置小时now_date.setMinutes(0);//设置分钟now_date ...

  5. 认识MySQL中的索引

    一.什么是索引 索引是一种将数据库中单列或者多列的值进行排序的结构,引用索引可以大大提高索引的速度. 二.索引的优缺点 优点:整体上提高查询的速度,提高系统的整体性能. 缺点:创建索引和维护索引都需要 ...

  6. 百练6255-单词反转-2016正式B题

    百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问   B:单词翻转 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个 ...

  7. epoll c++封装

    #ifndef _BFC_EPOLL_FLOW_HPP_ #define _BFC_EPOLL_FLOW_HPP_ #include <string.h> #include <err ...

  8. XXS level5

    (1)用第四关的方法尝试,发现不行,查看页面源代码,发现on中间有了下划线 (2)查看PHP源代码 <?php ini_set("display_errors", 0); $ ...

  9. vmware NAT 网络出现问题的解决方法

    nat 网络的配制: 用nat网络相对来说,以后网段出现改变,都不会有大的影响,方便以后做实验. 用dhclient 来获取IP dhclent -r 是用来关闭获取IP的. 自动获取IP,也可以改成 ...

  10. <<操作,&0xff以及|的巧妙运用(以POJ3523---The Morning after Halloween(UVa 1601)为例)

    <<表示左移,如a<<1表示将a的二进制左移一位,加一个0,&0xff表示取最后8个字节,如a&0xff表示取a表示的二进制中最后8个数字组成一个新的二进制数, ...