0

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

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

谢谢

4

2 回答 2

2

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

这很简单,但是您需要先掌握一些概念,因为您似乎在 CRM 2011 编码方面可能没有太多经验(如果您这样做了,我深表歉意)。

这是有关如何开始编写插件的快速指南:

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

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

  • 获取当前创建的(post image)/edited(post image)/deleted(pre image)实体
  • 使用创建/更新/删除实体的 ID 通过相关查找字段(类似于 的内容)查询所有受影响实体的 CRM ctx.new_bSet.Where(b => new_aid.Id == aEntity.Id).ToArray();
  • 根据需要更新每个受影响的实体。

编辑:

这是基于通过 CRM 开发人员工具创建的预生成类的示例代码,关于插件的外观:

    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();
    }
于 2013-08-08T11:15:11.110 回答
0

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

如果您使用 LINQ 和早期绑定,以下代码将为您提供与 recordA 相关的所有连接

var connections = (from conn in context.CreateQuery<Connection>()
                                                      where (conn.Record1Id.Id == recordAid
                                                            select conn).ToList();

如果有,您可以为连接制作任何其他过滤器!希望能帮助到你

于 2013-08-08T10:02:14.850 回答