获取连接的实体
本文关键字:实体 连接 获取 | 更新日期: 2023-09-27 18:26:47
我有一个系统,实体a通过连接C连接到B。不同类型的连接具有不同的属性。
在使用Microsoft Dynamics CRM 2011 SDK的C#中,如何查找与刚刚更新的记录a相关的所有连接(C),然后使用连接中的信息更新连接另一端的记录B?每个记录A将有多个连接。
感谢
如果我理解正确,您在两个实体之间有一个1:N连接,并且您希望确保来自一个实体的一些数据复制到(或以某种方式影响)连接的实体上。
这很简单,但你需要先掌握一些概念,因为你可能没有太多的CRM 2011编码经验(如果你有,我道歉)。
以下是关于如何开始编写插件的快速指南:
- 从这里下载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插件
我会写插件如下:
- 获取当前创建的(后期图片)/编辑的(后期图像)/删除的(pre图片)实体
- 使用创建/更新/删除实体的ID,通过相关查找字段(类似
ctx.new_bSet.Where(b => new_aid.Id == aEntity.Id).ToArray();
)查询CRM中的所有受影响实体 - 根据需要更新每个受影响的实体
编辑:
以下是一个基于通过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();
}
首先,正如您所知,您必须为记录a的更新创建一个插件,因此无论何时更新记录a,都会触发该插件。然后,在插件中,您需要使用linq或任何其他检索方法进行连接,通过在连接实体中查找GUID来获取与记录a相关的连接,该GUID应为"Record1Id"。当你获得连接时,你可以为记录B使用GUId,它应该是"Record2ID"。所以当你得到记录B,然后根据你想要的从已经提取的连接中更新它,并更新它
如果您使用LINQ和早期绑定,下面的代码将为您提供与recordA相关的所有连接
var connections = (from conn in context.CreateQuery<Connection>()
where (conn.Record1Id.Id == recordAid
select conn).ToList();
如果有,你可以为连接制作任何其他过滤器!希望它能帮助