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 和其他几个列值自动创建。但是当我检查数据库时,CreatorUserIDnull,即使 CreationTime 在那里。 应该是 1 因为我使用默认管理员发布了。此外,当我删除行时,也会发生同样的情况:我只能看到 DeletionTime 而看不到 DeleterUserId

以下是我可以使用断点看到的 API 端点捕获的数据:

我尝试使用两种对象映射方法创建outputoutput2,但它们都为CreatorUserId 提供相同的null。按理说,CreatorUserIdCreationTime 在这个阶段都应该有值。

        [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.UserIdAbpSession.TenantId吗? @aaron 我在哪里检查这些? 该方法在 AppService 中吗? 【参考方案1】:

您的对象映射函数没有任何问题。

我尝试了两种对象映射方法...正确地,CreatorUserId 和 CreationTime 在这个阶段应该都有值。

CreatorUserIdCreationTime 仅在调用 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的主要内容,如果未能解决你的问题,请参考以下文章

java 造轮子之手写logback简单版

9.3 客户端接收响应信息(异步转同步的实现)

Swift - 将类型动态传递给 JSONDecoder

如何通过自动装配注入具有不同配置的不同ObjectMappers?

在 Spring Boot 应用程序中自动装配 ObjectMapper

三种String的转换 String.valueOf String强转 toString使用区别