预操作并发插件获取实体记录的最大现有字段值

Pre Operation Concurrent Plugins Getting MAXIMUM Existing Field Value For An Entity Records

我正在尝试在 Pre-Operation 插件中的实体上设置一个字段(记录编号),该插件会在创建时触发,并根据前一个编号创建一个增量编号。例如,如果 MAX Previous Record Number 是 4,我会将正在创建的那个设置为 5。我正在使用 LINQ 从实体记录中获取 MAX exiting number,然后递增 1。 我担心的是,如果 2 个或更多插件同时执行并做同样的事情怎么办。 CRM 是否有一个顺序机制来强制插件按顺序 运行,如果没有,我如何避免 2 个插件获得相同的先前最大记录数?

多个插件确实可以运行并发,因此您不能保证以这种方式计算的任何值的唯一性。许多解决方案使用外部数据库进行自动编号,但请记住,您将无法从 Sandbox 插件访问此数据库。

有一种方法可以使用自定义实体实现隔离,从而消除对所讨论的外部数据库的需求 here。但是,正如您将要读到的那样,它并不是开箱即用的功能。

CRM支持并发的方式是: 1、插件必须在pre或post操作。 2. 您需要更新您需要的实体上的一个字段。 (无论你想要什么价值)。 3. 你在这里添加你的逻辑。

第三步将授予您一个插件执行该逻辑,其他插件将等待它结束。

编辑: 这就是您所需要的:

Entity context = (Entity)executionContext.InputParameters["Target"];
Entity entity = new Entity { LogicalName = "salesorder", Id = context.Id };
entity["new_dummyfield"] = Guid.NewGuid().ToString();
service.Update(entity); // Lock

entity = service.Retrieve("salesorder", context.Id, new ColumnSet("new_autonumber"));
if (!entity.Contains("new_autonumber"))
{
    return;
}
int autonumber = (int)entity["new_autonumber"] + 1;
entity["new_autonumber"] = autonumber;
service.Update(entity);