Transactions dynamics crm-如何创建实体,然后在同一事务中保存id

Transactions dynamics crm-如何创建实体,然后在同一事务中保存id,transactions,hyperlink,dynamics-crm,microsoft-dynamics,Transactions,Hyperlink,Dynamics Crm,Microsoft Dynamics,我有一个.net程序必须这样做: 创建实体:帐户、地址、联系人等 检索新创建实体的id 将此id另存为自定义实体中的新记录,如“CreateJournal” 所有这些都必须在一种交易中发生。也就是说:第一步和第三步必须同时进行:要么失败,要么成功 我试过这个: Account acc = new Account(); acc.Name = "test on " + DateTime.Now.ToString(); Context.AddObject(acc); CreateJournal jE

我有一个.net程序必须这样做:

  • 创建实体:帐户、地址、联系人等
  • 检索新创建实体的id
  • 将此id另存为自定义实体中的新记录,如“CreateJournal”
  • 所有这些都必须在一种交易中发生。也就是说:第一步和第三步必须同时进行:要么失败,要么成功
  • 我试过这个:

    Account acc = new Account();
    acc.Name = "test on " + DateTime.Now.ToString();
    Context.AddObject(acc);
    
    CreateJournal jEntry = new CreateJournal();
    jEntry.targetid = acc.Id.ToString();
    Context.AddObject(jEntry);
    
    Context.SaveChanges();
    
    但它不起作用,targetId是Guid.Empty


    上下文类型为OrganizationServiceContext

    在您感兴趣的每个实体上使用插件。您有一个日志,例如创建事件的后期插件,它将创建日志实体。它将在“事务”模式下工作。

    CRM支持在创建记录之前为新对象分配ID。请记住,与整数id不同,guid是全局唯一的,因此基于guid的系统通常支持这种“先设置id”的行为

    特定于您的代码。。。尝试按如下方式分配acc.Id:

    Account acc = new Account();
    acc.Name = "test on " + DateTime.Now.ToString();
    acc.Id = Guid.NewGuid();
    Context.AddObject(acc);  
    
    编辑:(对不起,我没有意识到)此代码不是在插件代码中运行的,因此您在处理事务时运气不佳。看

    此处部分记录了您可能听说过的交易行为,并解释了CRM中交易支持的上下文:

    这是个好主意,但是我怎么知道哪个“联系人”是由我自己的代码创建的,哪个是由用户创建的呢?因为插件是针对这两种情况执行的。@Flavius没有通用的方法来知道“谁”创建了联系人,但是一些解决方法是可能的。e、 g.添加一些仅在代码中设置的新字段,或者,您的代码将在某些预定义的用户凭据下工作。我尝试过这样做,但我不明白为什么“SaveChanges”的行为不像事务。我所做的:我为CreateJournal实体(预操作)的“create”消息添加了一个插件,该插件会抛出一个异常,因此每次都会失败。然后我运行代码,帐户仍然出现,CreateJournal没有出现。您的插件步骤是否注册为异步?它们需要是同步的,才能获得您想要的事务行为。此代码不在插件中,而是控制台应用程序。我最初认为“Context.SaveChanges”的行为类似于事务,但事实并非如此。它indeds将对象作为一个批发送到服务器,但是一旦到了那里,插入对象就是原子的。我的错误。编辑了答案。