代码之家  ›  专栏  ›  技术社区  ›  hkhan

如何在CRM Online 2013中拥有唯一的ID编号

  •  1
  • hkhan  · 技术社区  · 10 年前

    我正在使用CRM Online 2013,在我的自定义实体中有一个唯一的字段,名称为 ID 。此ID是手动输入的,需要是唯一的。是否有方法检查该ID是否以前在其他记录中输入过?例如,如果存在ID为111、222、333的先前记录,并且如果用户试图保存ID为111的新记录,则应发出警报。

    3 回复  |  直到 10 年前
        1
  •  1
  •   Daryl    10 年前

    我会用双叉法。在Id字段的onChange事件期间,通过javascript执行Odata,如果它已经在使用,则警告用户。这可能是所需的全部内容,但同时输入相同id的人员a和人员B之间存在竞争条件的可能性仍然存在。在这种情况下,您需要一个插件来确认它是唯一的。

    Odata调用让用户更容易,因为他们可以立即得到反馈,插件只是帮助关闭比赛条件差距。

        2
  •  1
  •   Scorpion    10 年前

    然而,我不赞成用户键入的唯一号码。出于性能原因,它应该是自动生成的。此外,如果用户必须多次输入一个号码才能找到唯一的号码,这可能会让用户感到沮丧。除非您有任何定义的模式,否则用户不可能猜测唯一的数字。

    但你仍然可以通过编写一个预验证或预操作插件来实现你想要的。在插件中检查Id等于给定Id的现有记录。如果以前使用过,则抛出新记录 InvalidPluginExecutionException 带有错误消息。

    由于如果数据库中有数百万条记录,那么查询将非常繁重,因此我建议您在此列上设置SQL索引,以缩短处理时间。或使用自动生成的唯一值填充字段。

        3
  •  0
  •   Nicknow    10 年前

    这里是一个粗略且未经测试的基本代码示例,您需要使用它来检查值的唯一性。我建议在唯一字段和主键字段上设置一个索引,以提高性能,如果您希望高记录数或创建大量记录。

    /// <summary>
        /// Determines if the uniqueField contains a unique value.
        /// </summary>
        /// <param name="entityName">Logical Name of the entity being checked</param>
        /// <param name="uniqueField">Field on the entity to check for uniqueness</param>
        /// <param name="recordIdField">Field on the entity that is hte Primary Key (not attribute) of the Entity - should be logical name of the entity followed by 'id' (i.e., accountid)</param>
        /// <param name="valueToCheck">Value to ensure is unique to this record</param>
        /// <param name="currentRecordId">Id (Primary Key) of the current record</param>
        /// <param name="service">An instance of IOrganizationService with Organization-wide permission to read the entity</param>
        /// <returns></returns>
        public bool isUniqueRecord(string entityName, string uniqueField, string recordIdField, string valueToCheck, Guid currentRecordId, IOrganizationService service)
        {
            var query = new QueryExpression(entityName)
            {
                ColumnSet = new ColumnSet(true)
            };
    
            var criteria = new FilterExpression(LogicalOperator.And);
            criteria.AddCondition(new ConditionExpression(uniqueField, ConditionOperator.Equal, valueToCheck));
            criteria.AddCondition(new ConditionExpression(recordIdField, ConditionOperator.NotEqual, currentRecordId));
    
            query.Criteria = criteria;
    
            var result = service.RetrieveMultiple(query);
    
            if (result.Entities.Any()) return false;
            else return true;            
    
        }