获取已连接的实体

时间:2013-08-08 09:25:22

标签: c# plugins dynamics-crm-2011

我有一个系统,实体A通过连接C连接到B.不同类型的连接具有不同的属性。

在使用Microsoft Dynamics CRM 2011 SDK的C#中,如何查找与刚刚更新的记录A相关的所有连接(C),然后使用info更新连接另一端的记录B.从连接?每条记录A都有多个连接。

谢谢

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您在两个实体之间有1:N连接,并且您希望确保来自一个实体的某些数据被复制(或以某种方式影响)连接的实体。

这非常简单,但你需要首先掌握一些概念,因为看起来你可能没有太多的CRM 2011编码经验(如果你这样做,我道歉)。

以下是如何开始编写插件的快速指南:

  • here
  • 下载CRM 2011开发人员SDK
  • 为Visual Studio安装CRM开发人员工具(SDK\tools\...)(2010年或2012年)
  • 创建一个新的VS项目 - 使其成为Dynamics CRM插件库并连接到您的CRM
  • 在“CRM资源管理器”窗口中,选择要“响应”的实体 - 更改它将导致其他实体更新
  • 右键单击 - 创建插件。
  • 好了,现在您已经阅读了有关CRM 2011中插件注册的一些内容。我认为您可能需要创建3个插件,实际上是:创建后,更新后和预删除。编辑后更新将受益于使用后实体图像。
  • 创建代理类 - 理论上,开发人员工具可以创建代理类型,但它们不会创建DataContext类型类,我认为LINQ查询可以让生活更轻松。您可以使用SDK\bin\crmsvcutil.exe生成代理类,只需确保添加/serviceContextName参数即可。将生成的文件添加到项目中。
  • 那么,此时剩下的就是编写代码了。您应该查看SDK中提供的示例,以便更好地了解如何编写CRM插件代码。

我会按如下方式编写插件:

  • 获取当前创建的(后期图片)/已修改(后期图片)/已删除(图片) 实体
  • 使用创建/更新/删除的实体的ID,通过相关的查找字段(ctx.new_bSet.Where(b => new_aid.Id == aEntity.Id).ToArray();行)查询所有受影响实体的CRM。
  • 根据需要更新每个受影响的实体。

修改

以下是基于CRM Developer Tools创建的预生成类的示例代码,介绍插件的外观:

    protected void ExecutePostAccountCreate(LocalPluginContext localContext)
    {
        if (localContext == null)
        {
            throw new ArgumentNullException("localContext");
        }

        IPluginExecutionContext context = localContext.PluginExecutionContext;

        Entity postImageEntity = (context.PostEntityImages != null && context.PostEntityImages.Contains(this.postImageAlias)) ? context.PostEntityImages[this.postImageAlias] : null;

        // TODO: Implement your custom Plug-in business logic.

        //create a data context - DataContext is the name I use - it might be different depending on your usage of crmsvcutil!
        var ctx = new DataContext(localContext.OrganizationService);

        //use the post image to get a strongly typed object
        //you can use aEntity to get whatever information you need for updating other entities
        var aEntity = postImageEntity.ToEntity<new_A>();

        //get the related entities (add using System.Linq!)
        //I'm assuming the relationship is A (1:N) B
        var bEntities = ctx.new_bSet.Where(e => e.new_aId.Id == aEntity.Id).ToArray();
        foreach (var bEntity in bEntities)
        {
            //set values for each of the entities here
            //for example: bEntity.new_field1 = aEntity.new_fieldBase;
            ctx.UpdateObject(bEntity);
        }
        ctx.SaveChanges();
    }

答案 1 :(得分:0)

首先,您知道必须为记录A创建更新插件,因此每当记录A更新时,都会触发插件。然后在插件中,您需要使用linq或任何其他检索方法进行连接,以通过查找连接实体中的GUID来获取与记录A相关的连接,它应该是“Record1Id”。当你得到连接然后你可以使用GUId作为记录B它应该是“Record2ID”。所以当你得到记录B然后根据你想要的表格已经获取的连接更新它并更新它。

如果您使用LINQ和早期绑定

,以下代码将为您提供与recordA相关的所有连接
var connections = (from conn in context.CreateQuery<Connection>()
                                                      where (conn.Record1Id.Id == recordAid
                                                            select conn).ToList();

如果有连接,您可以为连接创建任何其他过滤器! 希望它有所帮助