我们有一个带有MS Dynamic CRM的asp.net核心Web Api作为数据库,我们希望实现队列消息以获得更好的性能,我们的选择是RabbitMQ。
我们在CRM中编写了很多案例,但新CRM实体记录的ID是自动生成的GUID。这个新的GUID将用于其他请求,例如:在其他实体中查找,更新此记录..
假设我们有3个实体:
Topics [ID(auto-generated), Name]
UserTopic [ID(auto-generated), UserId, TopicId]
UserComment [ID(auto-generated), UserTopicId(1), Comment]
当用户订阅主题时,我们应该在Web API级别执行以下操作:
1- Send a message to the queue of register in topic
2- Add an object UserTopic to the cache (with an empty or auto-generated GUID)
因此,消息处理程序将在UserTopic实体中插入一条新记录,其中CRM将生成Web API不了解的新GUID(2)。
如果用户需要为此主题添加评论,我们需要GUID(2)插入实体UserComment (1)。
那么如何在消息处理程序中处理由CRM创建的这种自动生成的GUID?
答案 0 :(得分:0)
基本上你有三种不同的选择
与通知中建议的一样,您可以检索在创建记录期间分配的ID。这将需要您的消息传递中的RPC模式,这与异步消息传递的性质相矛盾
您可以在创建请求中定义ID。然后,您在实体的构造函数或id属性中分配的ID用于在CRM中创建记录。
public Entity (string logicalName, Guid id) {…}
您必须确保传递的ID尚未用于此实体
您可以在依赖CRM的主键时使用备用键。因此,您可以使用Web api应用程序的标识符来标识CRM中的相应记录。
答案 1 :(得分:0)
另一种解决方案是使用以下字段创建一个简单的SQL(或任何替代)映射表:
Id uniqueidentifier /* Sent from API within the request */
CrmId uniqueidentifier /* Autogenerated by CRM */
因此,当RabbitMQ创建CRM记录并将新记录插入新SQL表时,无论何时您需要CRM中的数据(缓存过期后),您都可以使用发送的ID来获取CrmId。