FullAuditedEntity、ObjectMapper:创建新条目或删除时的 CreatorUserId Null
Posted
技术标签:
【中文标题】FullAuditedEntity、ObjectMapper:创建新条目或删除时的 CreatorUserId Null【英文标题】:FullAuditedEntity, ObjectMapper: CreatorUserId Null when Creating New Entry or Deleting 【发布时间】:2018-06-14 23:59:52 【问题描述】:我一直在通过 API 将数据发布到经过全面审核的实体。因为它是FullAuditedEntity
,它应该使用 creatorId、creationTime 和其他几个列值自动创建。但是当我检查数据库时,CreatorUserID
是 null
,即使 CreationTime
在那里。 应该是 1
因为我使用默认管理员发布了。此外,当我删除行时,也会发生同样的情况:我只能看到 DeletionTime
而看不到 DeleterUserId
。
以下是我可以使用断点看到的 API 端点捕获的数据:
我尝试使用两种对象映射方法创建output
和output2
,但它们都为CreatorUserId
提供相同的null
值。按理说,CreatorUserId
和 CreationTime
在这个阶段都应该有值。
[AbpAuthorize]
public async Task<Rule> CreateAsync(CreateRuleInput input)
Rule output = Mapper.Map<CreateRuleInput, Rule>(input);
Rule output2 = ObjectMapper.Map< Rule>(input);
return await _ruleManager.Create(output);
我的对象映射函数有什么问题吗?
【问题讨论】:
TenantId
在数据库中吗?
@aaron 是的。我必须手动将其放入 JSON post 对象中,并显示在数据库中。
你能检查AbpSession.UserId
和AbpSession.TenantId
吗?
@aaron 我在哪里检查这些?
该方法在 AppService 中吗?
【参考方案1】:
您的对象映射函数没有任何问题。
我尝试了两种对象映射方法...正确地,CreatorUserId 和 CreationTime 在这个阶段应该都有值。
CreatorUserId
和 CreationTime
仅在调用 SaveChanges()
之后才有值。
我必须将 [TenantId] 手动放入 JSON post 对象中,它会显示在数据库中。
你不应该那样做。 CreatorUserId
是 only set if the entity belongs to the current tenant。
我可以看到断点中的 UserId 为 1。不知何故,它在映射过程中被忽略了。
将实体创建为“默认”租户管理员的正确方法是以租户管理员身份登录。
UserId = 1
表示您以主机管理员身份登录。 “默认”租户管理员拥有UserId = 2
。
如果我不指定tenantId 或输入0,它会给出服务器内部错误:500。
如果您希望主机创建Rule
,请确保它实现IMayHaveTenant
而不是IMustHaveTenant
。
【讨论】:
感谢您的回答!事实上,我刚刚发现它并发布了答案。我不知道这是功能还是错误,但默认主机管理员也应该能够创建实体。因为现在,这让我很困惑 如果您希望主机创建Rule
,请确保它实现IMayHaveTenant
而不是IMustHaveTenant
。【参考方案2】:
问题在于默认管理员,因为它没有租户。
从另一个租户,我创建了一个新用户并使用新用户的凭据发布数据。然后我通过在帖子正文中省略tenantId
来发布数据。而且效果很好。
我曾经在 默认管理员(主机租户)的发布数据对象中指定 tenantId
。如果我不指定tenantId
或输入0
,它会给出Server Internal Error: 500
。所以,我必须在帖子正文对象中指定tenantId
。我认为因为 默认管理员没有租户,它会以某种方式与 API 内的映射混淆。
【讨论】:
以上是关于FullAuditedEntity、ObjectMapper:创建新条目或删除时的 CreatorUserId Null的主要内容,如果未能解决你的问题,请参考以下文章
如何通过自动装配注入具有不同配置的不同ObjectMappers?