自动更新自定义实体字段 when/with 差异自定义实体字段已更新
Updating Custom Entity fields automatically when/with a diff Custom Entity fields are updated
我有 2 个自定义实体,例如:内部 CRM 中的构建和业务。建筑物有多个 Units/Suite#,每个 Unit/Suite# 都被一个企业占用。如果建筑物 Unit/Suite 正在装修,则该业务必须暂时关闭。
如何在建筑物 Unit/Suite 状态发生变化时自动更新业务 Open/Close?更新不需要立即发生。我需要搜索大约 20000 条记录来更新正确的业务实体。 Business 中还有一些字段,例如从 Building 中检索的开始日期和结束日期,关闭持续时间更新为结束(减去)开始日期。
插件是唯一的方法吗?我如何使用插件来实现它!这有多困难,对服务器的影响,我是中级 C# 开发人员。请提供正确方向的任何链接。环境是 2011 年本地
非常感谢!!!
可以使用插件构建简单的解决方案。同步插件可以立即更新业务实体的状态更改(在更新消息的 PreOperation 或 PostOperation 阶段),甚至在同一数据库事务中也是如此。
一般来说,使用插件您可以构建最高效和无缝集成的业务逻辑。
但是,通常您实际上可以使用工作流实现几乎相同的效果。构建工作流的一些优势:
- 不需要熟练的软件开发人员来构建;
- 可以快速修改 ('configured') 工作流程。
- 可以推迟工作流的执行(例如,直到满足条件或已过日期)。
工作流的一些缺点是:
- 在 CRM 2011 中,您的代码始终在原始数据库事务之外异步运行;
- 可能要过一些时间才能采取行动;用户没有得到即时反馈;
- 查询和选择相关数据仅限于n:1个关系(从n端到1端,反之不能);
- 工作流的执行需要比插件更多的资源;
- 大量使用工作流很容易导致难以维护且性能不佳的意大利面式系统。
在您的场景中,选择适当业务记录的要求似乎太复杂而无法在工作流中处理。在工作流中,您基本上只能通过跟踪手头记录上的查找引用从一个记录导航到另一个记录。这意味着当存在 n:1 关系并且从 n 侧导航到 1 侧时,您只能从一条记录获取另一条记录。
在插件中你没有这个限制;在那里你可以编写一个 QueryExpression 或 Linq 查询来获取你需要的记录。所以,在你的情况下,插件对我来说似乎是正确的选择。
我有 2 个自定义实体,例如:内部 CRM 中的构建和业务。建筑物有多个 Units/Suite#,每个 Unit/Suite# 都被一个企业占用。如果建筑物 Unit/Suite 正在装修,则该业务必须暂时关闭。
如何在建筑物 Unit/Suite 状态发生变化时自动更新业务 Open/Close?更新不需要立即发生。我需要搜索大约 20000 条记录来更新正确的业务实体。 Business 中还有一些字段,例如从 Building 中检索的开始日期和结束日期,关闭持续时间更新为结束(减去)开始日期。
插件是唯一的方法吗?我如何使用插件来实现它!这有多困难,对服务器的影响,我是中级 C# 开发人员。请提供正确方向的任何链接。环境是 2011 年本地
非常感谢!!!
可以使用插件构建简单的解决方案。同步插件可以立即更新业务实体的状态更改(在更新消息的 PreOperation 或 PostOperation 阶段),甚至在同一数据库事务中也是如此。
一般来说,使用插件您可以构建最高效和无缝集成的业务逻辑。
但是,通常您实际上可以使用工作流实现几乎相同的效果。构建工作流的一些优势:
- 不需要熟练的软件开发人员来构建;
- 可以快速修改 ('configured') 工作流程。
- 可以推迟工作流的执行(例如,直到满足条件或已过日期)。
工作流的一些缺点是:
- 在 CRM 2011 中,您的代码始终在原始数据库事务之外异步运行;
- 可能要过一些时间才能采取行动;用户没有得到即时反馈;
- 查询和选择相关数据仅限于n:1个关系(从n端到1端,反之不能);
- 工作流的执行需要比插件更多的资源;
- 大量使用工作流很容易导致难以维护且性能不佳的意大利面式系统。
在您的场景中,选择适当业务记录的要求似乎太复杂而无法在工作流中处理。在工作流中,您基本上只能通过跟踪手头记录上的查找引用从一个记录导航到另一个记录。这意味着当存在 n:1 关系并且从 n 侧导航到 1 侧时,您只能从一条记录获取另一条记录。
在插件中你没有这个限制;在那里你可以编写一个 QueryExpression 或 Linq 查询来获取你需要的记录。所以,在你的情况下,插件对我来说似乎是正确的选择。