Abp问题解决集合1
ABP学习经验
- 1. 视图中(控制器中直接使用仓储)会遇到使用实体外键,出现数据库连接关闭的错误
初学者经常会犯这样一个错误,没错说的就是我自己,这个问题折腾了我很长世间。还是没有细看文档,对abp领会不深。
开始描述问题,一开始我想着方便,因为只是一个简单的表对象输出,该表的entity每个字段都会别输出到视图,所以我想每笔要搞那么麻烦,再去建立一个Dto类,结果我在视图中尝试获取一个entity的外键对象时,出错了,错误的描述就不粘上来了,大意是数据库上下文已被注销,所以不能通过它取数据拿数据。
出现这个错误的原因很简单:
比如User类型引用Role类型。当你从数据库获取User时,Role属性并没有被填充。当你第一次读取Role属性时,才会从数据库中加载Role。所以,当你返回这样一个实体给展现层时,很容易引起副作用(从数据库中加载),而abp框架被设计为一旦service或者控制器中的action执行完毕就会自动关掉当前的数据库连接。
所以建议:
在展现层中使用实体还会有更多的问题。最佳的方案就是展现层不应该引用任何包含领域层的程序集。
- 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();
}
这个是禁用软删除的数据过滤,禁用多租户的应该也是可以以此种方式实现的,具体的代码文档没有,需要的自己点一下应该是能很轻易找到的。
- 3. AbpWebapi通过abp的service动态生成的如果service方法返回的对象是数据库Entity,产生“The 'ObjectContent`1' type failed to serialize the response body for content type”错误
这种情况下只能使用自定义的model类,建议使用abp的dtooutput
Abp问题解决集合1的更多相关文章
- Python跨域问题解决集合
Flask 安装插件 pip install flask-cors 使用 CORS函数配置全局路由 from flask_cors import * app = Flask(__name__) COR ...
- ABP中的本地化处理(上)
今天这篇文章主要来总结一下ABP中的多语言是怎么实现的,在后面我们将结合ABP中的源码和相关的实例来一步步进行说明,在介绍这个之前我们先来看看ABP的官方文档,通过这个文档我们就知道怎样在我们的系统中 ...
- ABP集合贴
thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>t ...
- ABP集合贴(转)
ABP集合贴 本文背景 公司最近规划的新框架准备基于ABP来搭建,自从在阳铭博客看到ABP框架的介绍后,就一直持续关注着,但还没真正在实际项目中直接使用ABP,只是自己做了一些学习和Demo.ABP所 ...
- ABP Zero示例项目登录报错“Empty or invalid anti forgery header token.”问题解决
ABP Zero项目,登录时出现如图"Empty or invalid anti forgery header token."错误提示的解决方法: 在 WebModule.cs的P ...
- ABP集合帖
http://www.cnblogs.com/kebinet/p/5341663.html http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent ...
- ABP运行Login failed for user 'IIS APPPOOL XXXXX Reason: Could not find a login matching the name provided问题解决
我们在ABP官网上面生成解决方案后,编译完成,将数据库连接字符串中的Ip改成自己的测试数据库Ip直接在Vs里面调试运行没有任何问题. 发布之后到文件夹后运行,就报如下图异常. VS里面可以跑起来,单独 ...
- 当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand问题解决
1.目前看主要因为两种,第一种是select语句没有包含主键列,select * 就可以解决.或 select 主键列 这里的主键是指的primary key而不是unique key 2.最重要的 ...
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
随机推荐
- 【转】Delphi XE10 Android Splash设备自适应和沉浸式状态条
再次提笔写博客,已经相隔7年,原来的CSDN账号需要手机验证,而我的手机又捆绑到这个账号了,就用新账号吧,不想折腾了. 原账号的帖子,有研究DICOM3.0的可以看下:http://blog.csdn ...
- 爬虫系列5:scrapy动态页面爬取的另一种思路
前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...
- Java的Annotation标签
只需要简单的使用Java的Annotation标签即可将标准的Java方法发布成Web Service,但不是所有的Java类都可以发布成Web Service.Java类若要成为一个实现了Web S ...
- 2.10 select下拉框
2.10 select下拉框 本篇以百度设置下拉选项框为案例,详细介绍select下拉框相关的操作方法. 一.认识select 1.打开百度-设置-搜索设置界面,如下图所示 2.箭头所指位置,就 ...
- phpstorm使用zen coding 快速编辑补全html/css代码
百科定义: 使用仿CSS选择器的语法来快速开发HTML和CSS ——由Sergey Chikuyonok开发. Zen Coding由两个核心组件组成:一个缩写扩展器(缩写为像CSS一样的选择器)和上 ...
- pandas Dataframe 构造
- PAT-L2-007 家庭房产 (union-find) 小数据 没有什么是暴力解决不了的!!
题目分析: 典型的union-find 算法 想法: 先不着急 union 因为每一个人的房产信息不知道 所以先输入所有信息 同时保留与自己有关系的每一个人 待初始化每一个人的房产信息后,再union ...
- vue 移动端的一些ui
https://www.jianshu.com/p/b79b3b721cd5 Vant. YDUI. Vonic. buefy (bluma的ui) Vux
- PTA——天平找小球
PTA 7-22 用天平找小球 #include<stdio.h> int main() { int a,b,c; scanf("%d%d%d",&a,& ...
- java-Random类
1.Random类的概述和方法使用 * A:Random类的概述 * 此类用于产生随机数 * 如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数 ...