MS Dynamics365 - 生成自定义序列号,确保唯一性

MS Dynamics365 - generate custom serial number, ensure uniqueness

我正在开发基于 Dynamics365 CRM 的解决方案,对于我们定义的自定义实体,我们需要创建自定义序列号。

出于各种商业原因,GUID 和顺序编号方案都行不通 - 企业坚持采用

的格式
99-9999-9999

其中每组数字基本上是一组随机数字。

在插件中创建它们很容易 - 但我如何确保 唯一性?我本质上是一名 C#/SQL 服务器开发人员,在 SQL 服务器 / T-SQL 中,我只是在我的 "Entity" [= 上创建一个唯一索引40=] 在这一栏。检查新创建的号码是否存在很容易 - 只需执行

IF EXISTS (SELECT * FROM dbo.MyEntity WHERE SerialNum = @SerialNumGenerated)

检查一下,因为该单列已编入索引并且 NOT NULL,它也会非常快。

但是 我如何 在 Dynamics365 中做同样的事情(至少 "same" 尽可能)?我如何以编程方式检查(在我的 C# 插件中)新创建的 "serial number" 是否尚未使用 - 这样做足够快,不会减慢保存过程太多?我能否以某种方式 "index" 在我的自定义实体上 属性 并执行类似于 IF EXISTS() 签入 T-SQL 的操作?

感谢任何提示或指点!

假设您无法设计从天文角度看不太可能生成重复项的生成公式(例如 GUID)。您将需要遵循此一般逻辑。

  1. 运行 创建唯一 ID 的公式。
  2. 通过 RetrieveMultiple 搜索 CRM 以检查是否有任何已经具有该编号的记录。
  3. 如果号码已经存在;回到 1.
  4. 其他;使用新 ID 更新记录。

然后您必须决定在何处执行您的代码。两个选项 spring 考虑。

  1. 在'box'中,例如一个插件或 JavaScript。在这种情况下,您会遇到这样的问题,即可能会在彼此不了解的情况下同时多次执行您的公式。根据您的公式生成重复项的可能性以及创建记录的速率,这可能是可以接受的。

  2. 走出'box',例如控制台应用程序 运行 按计划查找没有编号的记录。然后对每条记录进行编号。单线程方法具有确保唯一性的好处,但从用户角度来看会变慢。

如果是我并且我必须实现此要求,我会选择选项 2。

您想在 pre-operation 插件中进行编号。只有这样才能完全保证唯一性,性能非常好,并且这个数字在创建记录后立即存在。

1) 生成字符
您可以使用任何您想要的方法,作为数据库开发人员,我通常只默认使用我熟悉的方法,即 Guid.NewGuid().ToString();

的子字符串

2) 检查唯一性

    QueryExpression query = new QueryExpression("[prefix_yourentityname]")
    query.Criteria.AddCondition("prefix_yourfieldname", ConditionOperator.Equal, [IDNumber]);
    query.TopCount = 1;
    bool isUnique = Service.RetrieveMultiple(query).Entities.Count = 0;

3) 在目标上设置ID号,以便与交易一起保存

性能:
此检查显然会导致对数据库进行较小的读取操作,但您没有更好的选择。如果您使用 on-premise CRM,您可以针对此 table 添加索引,包括 ID 字段。 Microsoft 支持为 CRM 数据库编制索引。

如果您使用在线 CRM,您唯一可以做的就是将您的 ID 字段添加到此实体的快速查找视图 "View Columns" 和 "Search Columns"。 CRM 应用程序根据“快速查找”视图中的配置在每个 table 上生成一个索引,因此将您的 ID 列添加到此视图将导致该字段被添加到索引中。