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

Linq 操作前并发插件获取实体记录的最大现有字段值,linq,linq-to-sql,dynamics-crm-2011,dynamics-crm,dynamics-crm-2013,Linq,Linq To Sql,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm 2013,我试图在Pre-Operation plugin中的实体上设置一个字段(记录编号),该字段在创建时触发,并基于上一个字段设置一个增量编号。例如,如果最大先前记录编号为4,则我会将正在创建的记录编号设置为5。我使用LINQ从实体记录中获取最大退出数,然后递增1。 我关心的是,如果两个或更多插件同时执行并执行相同的操作,会怎么样。CRM是否有一种顺序机制来强制插件按顺序运行?如果没有,我如何避免两个插件获得相同的先前最大记录数?多个插件确实可以同时运行,因此您无法保证以这种方式计算的任何值的唯一性。

我试图在Pre-Operation plugin中的实体上设置一个字段(记录编号),该字段在创建时触发,并基于上一个字段设置一个增量编号。例如,如果最大先前记录编号为4,则我会将正在创建的记录编号设置为5。我使用LINQ从实体记录中获取最大退出数,然后递增1。
我关心的是,如果两个或更多插件同时执行并执行相同的操作,会怎么样。CRM是否有一种顺序机制来强制插件按顺序运行?如果没有,我如何避免两个插件获得相同的先前最大记录数?

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


有一种方法可以使用自定义实体实现隔离,而无需讨论外部数据库。但是,正如您将看到的,它不是现成的功能。

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


有一种方法可以使用自定义实体实现隔离,而无需讨论外部数据库。但是,正如您将看到的,它不是现成的功能。

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


有一种方法可以使用自定义实体实现隔离,而无需讨论外部数据库。但是,正如您将看到的,它不是现成的功能。

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


有一种方法可以使用自定义实体实现隔离,而无需讨论外部数据库。但是,正如您将看到的,它不是现成的功能。

CRM支持并发的方式是: 1.插件必须处于操作前或操作后状态。 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);

CRM支持并发的方式是: 1.插件必须处于操作前或操作后状态。 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);

CRM支持并发的方式是: 1.插件必须处于操作前或操作后状态。 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);

CRM支持并发的方式是: 1.插件必须处于操作前或操作后状态。 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);


谢谢你的回复。事实上,我对你提到的那篇文章有点困惑。我是否应该创建一个新的实体“Sequential”,并从我的插件生成一个新的GUID,更新Sequential实体上的“dummy field”,同时读取并更新Sequential number字段?谢谢您的回复。事实上,我对你提到的那篇文章有点困惑。我是否应该创建一个新的实体“Sequential”,并从我的插件生成一个新的GUID,更新Sequential实体上的“dummy field”,同时读取并更新Sequential number字段?谢谢您的回复。事实上,我对你提到的那篇文章有点困惑。我是否应该创建一个新的实体“Sequential”,并从我的插件生成一个新的GUID,更新Sequential实体上的“dummy field”,同时读取并更新Sequential number字段?谢谢您的回复。事实上,我对你提到的那篇文章有点困惑。我是否应该创建一个新的实体“Sequential”,并从我的插件生成一个新的GUID,更新Sequential实体上的“dummy field”,同时读取并更新Sequential number字段?谢谢您的回复。我已经更改了我的插件,因此它将执行以下操作;1-读取字段值。2-通过将此字段增加1来更新此字段。这是否保证该插件的多个实例具有悲观并发性?您需要检索实体,更新虚拟字段,再次检索实体并读取需要更新的字段,增加该字段。这支持并发。再次感谢。当你说虚拟字段时,你指的是我需要更新的字段吗?我有一个字段,我从中检索值,然后将其递增1。虚拟字段是您更新以获得事务控制权的值,通常是一个字符串,您可以在其中更新随机GUID。因为您只为您应该执行的事务执行此操作